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

递归做法:
* 将左子树转成一个左双向链表,并返回该链表的第一个节点(最左边的节点)
* 定位到左链表的最后一个节点(即左子树的最右节点)
* 如果左链表非空,将根的left指向左子树的最右节点,最右节点的right指向root
* 将右子树转成一个右双向链表,并返回链表的第一个节点
* 如果右链表非空,将root的right指向右链表的第一个节点,第一个节点的left指向root
public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null){
            return null;
        }
        if(pRootOfTree.left==null && pRootOfTree.right==null){
            return pRootOfTree;
        }
        TreeNode left=Convert(pRootOfTree.left); //将左子树转成一个左双向链表,且left指向的是左子树的最左节点
        //下面去找左子树的最右节点
        TreeNode p=left;
        while(p!=null && p.right!=null){
            p=p.right;
        }
        if(left!=null){
            pRootOfTree.left=p;
            p.right=pRootOfTree;
        }
        TreeNode right=Convert(pRootOfTree.right); //将右子树转成右双向链表
        if(right!=null){
            right.left=pRootOfTree;
            pRootOfTree.right=right;
        }
        return left!=null?left:pRootOfTree;

    }

  

猜你喜欢

转载自www.cnblogs.com/mengjie88/p/11979129.html