您的位置:首页 > 其它

把二元查找树转变成排序的双向链表

2012-03-26 16:16 357 查看
题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。

分析:

解法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来模拟递归过程,不详述
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: