二叉搜索树与双向链表

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

思路:二叉搜索树中序遍历就是有序序列,把整个树拆成3部分,根,左子树,右子树。连接起来应该是,左子树的最右叶子节点的右指针指向根,根的左指针指向左子树最右节点,根的右指针指向右子树的最左节点,右子树的最左节点的左指针指向根。然后递归遍历。最后判断左子树的最左节点是否为null,如果为null则返回根。

实现代码:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null)
            return null;
        if(pRootOfTree.left == null && pRootOfTree.right == null)
            return pRootOfTree;
        
        TreeNode leftNode = Convert(pRootOfTree.left);
        TreeNode curNode = leftNode;
        //找到左子树最右边的叶子节点
        while(curNode != null && curNode.right != null) {
            curNode = curNode.right;
        }
        //连接根节点与左子树的最右叶子节点
        if(leftNode != null) {
            pRootOfTree.left = curNode;
            curNode.right = pRootOfTree;
        }
        
        //右子树的最左叶子节点
        TreeNode rightNode = Convert(pRootOfTree.right);
        //连接根节点与右子树的最左叶子节点
        if(rightNode != null) {
            pRootOfTree.right = rightNode;
            rightNode.left = pRootOfTree;
        }
        //考虑没有左子树的情况
        return leftNode==null?pRootOfTree:leftNode;
    }
}
原文地址:https://www.cnblogs.com/wxisme/p/5456558.html