题目

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

思路-递归

将根节点左孩子和右孩子都转换为双向链表,然后改变跟节点的left和right指针

实现

public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null){
            return null;
        }
        if(pRootOfTree.left==null&&pRootOfTree.right==null){
            return pRootOfTree;
        }
        TreeNode p=Convert(pRootOfTree.left);
        TreeNode q=Convert(pRootOfTree.right);
        //注:最后递归返回的是一个双向链表的头,所以左边生成的双向链表必须遍历一下找到结尾,右边的可以直接使用
        if(p!=null){
            while(p.right!=null){
                p=p.right;
            }
            p.right=pRootOfTree;
            pRootOfTree.left=p;
        }
        if(q!=null){
            pRootOfTree.right=q;
            q.left=pRootOfTree;
        }
        //遍历找到此次递归生成的双向链表的头
        while(pRootOfTree.left!=null){
            pRootOfTree=pRootOfTree.left;
        }
        return pRootOfTree;
    }