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

public class Solution {
    //记录左子树的最右一个节点 有时候也指的是当前双链表的最后一个节点
    protected TreeNode lastLeft = null;
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null) return null;
        if(pRootOfTree.left==null && pRootOfTree.right==null){
            lastLeft = pRootOfTree;//最右侧的叶子节点
            return pRootOfTree;
        }
        //将左子树构成双向链表(lastLeft会被更新),并返回
        TreeNode leftList = Convert(pRootOfTree.left);
        //将根节点追加到左子树构成的双向链表之后
        if(leftList != null){
            lastLeft.right = pRootOfTree;
            pRootOfTree.left = lastLeft;
        }
        //当该树只有左子树,最后一个节点是根节点
        lastLeft = pRootOfTree;
        //将右子树构成双向链表,在convert中lastLeft被更新成了右边链表的最后一个节点
        TreeNode rightList = Convert(pRootOfTree.right);
        //将左边和右边连接起来
        if(rightList != null){
            rightList.left = pRootOfTree;//这里不是lastLeft,因为在最近一个convert()调用中已被更新
            pRootOfTree.right = rightList;
        }
        return leftList==null?pRootOfTree:leftList;
    }