二叉搜索树转双向链表

二叉搜索树与双向链表

http://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5

解题核心思想:查找左子树的最右节点,和右子树的最左节点,然后将其与根节点相连,连接时left指向小的,right指向大的,根节点和查找来的记得点均需要要进行修改。
注意:最后返回值要是最左边的那一个节点,不能直接返回原来的root节点

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

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

    }

}
*/
public class Solution {
    // 递归查找子树的最左或最右节点
    TreeNode f(TreeNode root, int leftOrRight){
        // 如果没有节点了,那就返回自己
        if(root.left==null&&root.right==null){
            return root;
        }
        // 如果左子树不为空,那就递归找左子树的最右节点
        if(root.left!=null){
            TreeNode tmpNode = f(root.left, 0);
            // 找到后,双向修改其指针
            root.left = tmpNode;
            tmpNode.right = root;
        }
        // 如果右子树不为空,那就递归找右子树的最左节点
        if(root.right!=null){
            TreeNode tmpNode = f(root.right, 1);
            // 找到后,双向修改其指针
            root.right = tmpNode;
            tmpNode.left = root;
        }
        // 如果当前子树是上一个根节点的左子树,那么返回的要么就是当前子树根节点的right,如果right为空则返回root
        if(leftOrRight==0){
            if(root.right==null){
                return root;
            }else {
                // 这个root已经是上一级返回了的
                return root.right;
            }
        // 右子树同理
        }else {
            if(root.left==null){
                return root;
            }else {
                return root.left;
            }
        }


    }
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree==null){
            return null;
        }
        if(pRootOfTree.left!=null){
            TreeNode tmpNode = f(pRootOfTree.left, 0);
            pRootOfTree.left = tmpNode;
            tmpNode.right = pRootOfTree;

        }
        if(pRootOfTree.right!=null){
            TreeNode tmpNode = f(pRootOfTree.right, 1);
            pRootOfTree.right = tmpNode;
            tmpNode.left = pRootOfTree;
        }
        TreeNode ans = pRootOfTree;
        while(ans.left!=null){
            ans = ans.left;
        }
        return ans;
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务