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

好一点点就是好一点点嘛

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 (prev != NULL)
 7     prev->right = root;
 8   else
 9     head = root;
10   prev = root;
11   BST2DoubleList(root->right, prev, head);
12 }
13
14 TreeNode* treeToDoublyList(TreeNode *root) {
15   TreeNode *prev = NULL;
16   TreeNode *head = NULL;
17   BST2DoubleList(root, prev, head);
18   return head;
19 }
时间: 2024-10-10 14:25:09

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

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

分析: 1. 二叉树的中序遍历正好是排好序的遍历方式,因此可以采用中序递归的方式来处理: 2. 可以用类似输出流的方式来"输出"节点到链表末尾: 3. 可以用局部变量来简化判断,优化程序. 程序: typedef struct tagTreeNode_s { int nValue; tagTreeNode_s* pLeftNode; tagTreeNode_s* pRightNode; } TreeNode_s; void AppendNode(TreeNode_s* pNode, T

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

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

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

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

二叉搜索树转换为有序双向链表

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

二叉搜索树转化为双向链表

1. 题目 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表.而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现. 二叉树结点的定义如下: struct BinaryTreeNode { intm_nValue; BinaryTreeNode*m_pLeft; BinaryTreeNode*m_pRight; }; 如图1-1(a)为一棵二叉搜索树,1-1(b)为对应的双向链表. 图1-1转化示意图 2. 分析 (1) 二叉搜索树中序遍历可得有序的结点序

九:二叉搜索树与双向链表(二叉搜索树转为有序双向链表)

问题描述: 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表.而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现. 解析: 借助二叉树中序遍历,因为中序遍历二叉搜索树的特点就是从小到大访问结点.当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可.进而更新当前链表的最后一个结点指针. 递归算法: (1)中序遍历. (2)原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子

4.二叉搜索树转为有序双向链表(递归算法与非递归算法)

一.题目 要求输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建新的节点,只能调整树中结点指针的指向. 二叉树结点定义如下: 1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode *m_pLeft; 5 BinaryTreeNode *m_pRight; 6 }; 图1.二叉搜索树转为有序双向链表 二.算法 (1)递归算法 因为二叉搜索树每个结点的子树也是一棵二叉搜索树,所以,我们可以把问题分解为, 把左子

二叉搜索树变成有序双向链表,要求不能创建新的结点,只调整指针的指向

二叉搜索树的结点有2个指针,分别指向左右孩子,双链表的每个结点也有2个指针,分别指向前后结点,所以在不创建新结点,只调整指针指向时可以将二叉搜索树变成双向链表:又由于二叉搜索树在中序遍历时是有序的,所以可以采用中序处理二叉搜索树调整指针指向将其变成有序双向链表.为了简化指针移动操作,我们让左孩子为前向指针,右孩子为后向指针. 二叉搜索树的最左结点即使整个树中最小的结点,所以首先找到最左结点,它就是链表的首结点,链表最后一个结点初始化为空.中序遍历时,当前结点的左孩子指向链表的最后一个结点,若最后

把二叉搜索树转化成更大的树 &#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 [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常