二叉排序树转化为有序双向链表

题目:
给出一棵排序二叉树根节点,将二叉树转化为有序的双向链表,只修改指针指向
显然这是个经典的题目,难点也不多,重在好好理解排序二叉树的特性和二叉树的递归性质。

解法:

思路:
排序二叉树既有特殊性left<root<right,同时又具备二叉树的递归性。
所以,将left和right子树分别转化完成后,root节点放在中间即可。
当需要转化left子树的时候
a)left == null,那么无需转化,head = root
b)left != null,那么head = leftHead;然后将left与root相接:root->left = leftTail, leftTail->right = root;

同样当需要转化right子树的时候
a)right = null,那么无需转化,tail = root;
b)right != null,那么tail = rightTail;然后将right与root相接: root->right = rightHead, rightHead->left = root;

评价:


代码:
/*
将二叉排序树转化为有序的双向链表
*/
void converBitTreeToLinkedList(BitTree *root, BitTree *&head, BitTree *&tail)
{
    BitTree *lHead, *lTail, *rHead, *rTail;
    if(!root)
    {
        head = tail = null;
    }
    //转化左子树  
    if(!root->left)//左子树为空,简单的情况 
    {
        head = root;
    }
    else
    {
        //转化完左子树 
        converBitTreeToLinkedList(root->left, lHead, lTail);
        //获取整个双向链表的头部,最小的肯定在左子树 
        head = lHead;
        //将left与root相接 
        /*如何相接可能不好理解。首先,从root的两个分支中任意选一个指针(这里选的是left指针)指向left子树 
        (此时已经决定了转化右子树的时候只剩下一个分支可以用,这里剩下的是right指针);然后根据递归的性质
        我们可以知道lTail也曾经是root节点,即left指针也已经被占用,所以应该用leftTail的右指针指向root 
        */ 
        root->left = lTail;
        lTail->right = root;
    }
    //转化右子树 
    if(!root->right)//右子树为空,简单的情况
    {
        tail = root;
    }
    else
    {
        //转化完右子树 
        converBitTreeToLinkedList(root->right, rHead, rTail);
        //获取整个双向链表的尾部,最大的肯定在右子树 
        tail = lTail;
        //将right与root相接 
        root->right = lHead;
        lHead->left = root;
    }
    return;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值