将二叉搜索树转换成排序的双向链表

分析:

1. 二叉树的中序遍历正好是排好序的遍历方式,因此可以采用中序递归的方式来处理;

2. 可以用类似输出流的方式来”输出“节点到链表末尾;

3. 可以用局部变量来简化判断,优化程序。

程序:

typedef struct tagTreeNode_s

{

int nValue;

tagTreeNode_s* pLeftNode;

tagTreeNode_s* pRightNode;

} TreeNode_s;

void AppendNode(TreeNode_s* pNode, TreeNode_s*& pTailNode)

{

if (pNode == NULL)

return;

pTailNode->pRightNode = pNode;

pNode->pLeftNode = pTailNode;

pTailNode = pNode;

}

void AppendTree(TreeNode_s* pRootNode, TreeNode_s*& pTailNode)

{

if (pRootNode == NULL)

return;

AppendTree(pRootNode->pLeftNode, pTailNode);

AppendNode(pRootNode, pTailNode);

AppendTree(pRootNode->pRightNode, pTailNode);

}

TreeNode_s* ToLink(TreeNode_s* pRootNode)

{

TreeNode_s HeadNode;

TreeNode_s* pTailNode = &HeadNode;

pTailNode->pRightNode = NULL;

AppendTree(pRootNode, pTailNode);

pTailNode->pRightNode = NULL;

pTailNode = HeadNode->pRightNode;

if (pTailNode != NULL)

pTailNode->pLeftNode = NULL;

return pTailNode;

}

时间: 2024-10-08 15:43:47

将二叉搜索树转换成排序的双向链表的相关文章

将二叉搜索树转变成排序的双向链表

将二叉搜索树转变成排序的双向链表: 点击链接: http://blog.csdn.net/l_tudou/article/details/51753921

二叉搜索树转换成双向链表

好一点点就是好一点点嘛 RT 传入3个参数 <根节点,上次访问的节点,头结点>.Yahoo二面被问到!完跪.... 1 void BST2DoubleList(TreeNode *root, TreeNode *& prev, TreeNode *& head) { 2 if (root == NULL) 3 return; 4 BST2DoubleList(root->left, prev, head); 5 root->left = prev; 6 if (pr

输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。

一.问题描述 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表.而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现. 二.实现思路 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值.而在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点.所以这两种数据结构的结点是一致,二叉搜索树之所以为二叉搜索树,双向链表之所以为双向链表,只是因为两个指针的指向不同而已 思路

把二叉搜索树转化成更大的树 &#183; Convert BST to Greater Tree

[抄题]: 给定二叉搜索树(BST),将其转换为更大的树,使原始BST上每个节点的值都更改为在原始树中大于等于该节点值的节点值之和(包括该节点). Given a binary search Tree `{5,2,13}`: 5 / 2 13 Return the root of new tree 18 / 20 13 [暴力解法]: 时间分析: 空间分析: [思维问题]: [一句话思路]: 反向求和并把和赋给root.val [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常

二叉查找树转换成排序的双向链表

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何 新的结点,只调整指针的指向. 比如将二元查找树 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16. 思路:对于树的很多题目,都可以使用递归的方法来处理.这道题目也不例外.我们从最基本的思路来考虑这个题目. 把一个二叉树编程双向链表,最终是一个有序的序列,也就是中序遍历之后的结果,那么当我们采用中序遍历的方式遍历二叉树时,遍历到某个节点,是的前序节点的右

剑指OFFER之二叉搜索树与双向链表(九度OJ1503)

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果. 样例输入: 1 2 1 0 0 3 0 0 样例输出: 1 2 3 解题思路

【剑指offer】二叉搜索树转双向链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26623795 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成

二叉搜索树与双向链表的转换

题目:输入一棵二叉搜索树(记住是搜索树),将该二叉搜索树转换为一个排序的双向链表.要求:不能创建任何新的结点,只能调整树中结点指针的指向. 分析:如下图 因为是二叉搜索树.所以树的排列是规则的.通过中序遍历正好遍历的是由小到大的序列. 要求说明是只能改变树结点指针的指向,不能增加新的空间和结点.所以在中序遍历的时候,主要是遍历到结点后就去改变指针指向. 为了简单,采用递归进行遍历. 树的结构 struct BinaryTreeNode{ int m_data; BinaryTreeNode* m

二叉搜索树和双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. //二叉搜索树转换成双向链表.  //二叉树当前结点的左指针应指向该结点左子树中最右孩子的结点:同时最右孩子的右指针应指向当前结点:  //二叉树当前结点的右指针应指向该结点右子树中最左孩子的结点:同时最左孩子的左指针应指向当前结点:  public TreeNode Convert(TreeNode pRootOfTree) {      if(pRootOfTree=