把二元查找树转变成排序的双向链表
2012-03-26 16:16
357 查看
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
分析:
解法1:最简单的就是归并思想的运用,对于结点P,将P的左子树、右子树分别转化为排序的双向链表,然后与结点P链接起来。
解法2:考虑到中序遍历查找树的特点[有序输出],可以考虑替换中序遍历输出部分为链接当前结点与它的前一个结点last,关键点在于last这个结点如何得到。
解法3:解法二的非递归方式,其基本思想就是用一个栈stack来模拟递归过程,不详述
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
分析:
解法1:最简单的就是归并思想的运用,对于结点P,将P的左子树、右子树分别转化为排序的双向链表,然后与结点P链接起来。
void bst2DLL(BSTPtrhead, DLLPtr &lef, DLLPtr &rig) { lef = rig = NULL; if (head == NULL) return; // lef1, lef2 为左子树转化为双向链表后的头尾结点 DLLPtr lef1, lef2; // rig1, rig2 为右子树转化为双向链表后的头尾结点 DLLPtr rig1, rig2; bst2DLL(head->lef, lef1, lef2); bst2DLL(head->rig, rig1, rig2); head->lef = head->rig = NULL; // 处理左子树部分 if (lef2 != NULL) { lef2->rig = head; head->lef = lef2; } // 处理右子树部分 if (rig1 != NULL) { rig1->lef = head; head->rig = rig1; } lef = (lef1 != NULL) ? lef1 : head; rig = (rig2 != NULL) ? rig2 : head; }
解法2:考虑到中序遍历查找树的特点[有序输出],可以考虑替换中序遍历输出部分为链接当前结点与它的前一个结点last,关键点在于last这个结点如何得到。
voidbst2DLL_inorder(BSTPtr head, BSTPtr &last) { if (head == NULL) return; bst2DLL_inorder(head->lef, last); // 中序遍历的处理部分 head->lef = last; if (last != NULL) last->rig =head; last = head; bst2DLL_inorder(head->rig, last); }
解法3:解法二的非递归方式,其基本思想就是用一个栈stack来模拟递归过程,不详述
相关文章推荐
- 二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 算法与数据结构面试题(1)-把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 微软100题(1) 二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表[数据结构]
- 把二元查找树转变成排序的双向链表
- 算法1-把二元查找树转变成排序的双向链表
- 【转载】把二元查找树转变成排序的双向链表
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构]
- 二元查找树转变成排序的双向链表
- 每天一算法(把二元查找树转变成排序的双向链表 )
- 【老鸟学算法】二元查找树转变成排序的双向链表——算法思想及java实现
- 把二元查找树转变成排序的双向链表
- 1.把二元查找树转变成排序的双向链表[BST2DoubleLinkedList]
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表