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

原创 2012年03月26日 16:16:20

题目:

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

 

分析:

解法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来模拟递归过程,不详述

相关文章推荐

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

一网友对算法感兴趣,不知怎么得到了我的QQ号,加为好友。给我发来了微软面试题100题,让我做一做。我也正好想准备年底找工作的事儿,一举两得,就试试上面题目的难度。     第一道题是把二元查找树...

【Data structure & Algorithm】把二元查找树转变成排序的双向链表

把二元查找树转变成排序的双向链表   题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表,要求不能创建任何新节点,只调整指针指向。 比如将二元查找树               ...

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

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ ...
  • sanpwy
  • sanpwy
  • 2011年10月14日 16:23
  • 123

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

声明:题目来自: http://blog.csdn.net/v_JULY_v/archive/2010/11/17/6015165.aspx   JULY整理了100道微软等公司的面试题目,我想先不看...

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

声明:此题目来自 v_JULY_v的blog,出处http://blog.csdn.net/v_july_v/article/details/6004660 代码经过本人调试,不敢保证是最优的,但应...

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

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

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

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

【微软100面试题实现】第01题:把二元查找树转变成排序的双向链表

微软100面试题实现:第01题 题源自:http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:把二元查找树转变成排序的双向链表
举报原因:
原因补充:

(最多只允许输入30个字)