剑指offer26_二叉搜索树与双向链表

题目描述

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

/*
解题思路:类似于递归的中序遍历
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前pRootOfTree追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到pRootOfTree节点之后。
6.根据左子树链表是否为空确定返回的节点。

 */
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null)
            return null;
        if(pRootOfTree.left==null&&pRootOfTree.right==null)
            return pRootOfTree;
        // 1.将左子树构造成双链表,并返回链表头节点left
        TreeNode left = Convert(pRootOfTree.left);//备份left点
        TreeNode p = left;//返回的p是左子树链表的头节点,也就是left最终指向的节点
        // 2.定位至左子树双链表最后一个节点,也就是一直取最右
        while(p!=null&&p.right!=null){
            p = p.right;
        }
        // 3.如果左子树链表不为空的话,建立根节点root与左子树最右结点p的双向连接
        //将当前root追加到p的右边,root左节点指向P

        if(left!=null){
            p.right = pRootOfTree;
            pRootOfTree.left = p;
        }
        // 4.将右子树构造成双链表,并返回链表头节点
        TreeNode right = Convert(pRootOfTree.right);
        // 5.如果右子树链表不为空的话,将该链表追加到pRootOfTree节点之后
        if(right!=null){
            right.left = pRootOfTree;
            pRootOfTree.right = right;
        }
        return left!=null?left:pRootOfTree;//返回的是头节点,是left最终指向的那个点
        //左子树链表不为空则返回left,否则为空的话,头节点就是root。
    }
}

猜你喜欢

转载自blog.csdn.net/lilililililydia/article/details/88903640