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

题目:

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

 

分析:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值