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

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

解法:

思路:
排序二叉树既有特殊性left
所以,将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;
}


你可能感兴趣的:(初级算法杂谈)