面试题 36 :二叉搜索树与双向链表


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

论差距有多大。

by bigGold:

链接:https://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5
来源:牛客网

解题思路:
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。
    public TreeNode Convert(TreeNode root) {
        if(root==null)
            return null;
        if(root.left==null&&root.right==null)
            return root;
        // 1.将左子树构造成双链表,并返回链表头节点
        TreeNode left = Convert(root.left);
        TreeNode p = left;
        // 2.定位至左子树双链表最后一个节点
        while(p!=null&&p.right!=null){
            p = p.right;
        }
        // 3.如果左子树链表不为空的话,将当前root追加到左子树链表
        if(left!=null){
            p.right = root;
            root.left = p;
        }
        // 4.将右子树构造成双链表,并返回链表头节点
        TreeNode right = Convert(root.right);
        // 5.如果右子树链表不为空的话,将该链表追加到root节点之后
        if(right!=null){
            right.left = root;
            root.right = right;
        }
        return left!=null?left:root;       
    }

 

by myself:

class TreeNode21 {
    int val = 0;
    TreeNode21 left = null;
    TreeNode21 right = null;

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

    }
}

class Solution21 {
    public TreeNode21 Convert(TreeNode21 pRootOfTree) {
        if(pRootOfTree==null){
            return null;
        }
        if(pRootOfTree.left!=null)
            //将根节点的左边排成双链表的形式,并返回根节点
            pRootOfTree = convertDetail(pRootOfTree,pRootOfTree.left);
        if(pRootOfTree.right!=null)
            //将根节点的右边排成双链表的形式,并返回根节点
            pRootOfTree = convertDetail(pRootOfTree,pRootOfTree.right);//(13,11)
        while(pRootOfTree.left!=null){
            pRootOfTree=pRootOfTree.left;
        }
        return pRootOfTree;//返回整个链表的头结点
    }
    private TreeNode21 convertDetail(TreeNode21 parentNode,TreeNode21 node){ //1.(13,10) return 10
        if(node.left==null && node.right==null){
            if(parentNode.left==node){
                node.right=parentNode;
                return parentNode;
            }
            if(parentNode.right==node){
                node.left=parentNode;
            }
            return parentNode;
        }
        if(node.left!=null){
            convertDetail(node,node.left);
        }
        if(node.right!=null){
            convertDetail(node,node.right);
        }
        if(parentNode.left==node){
            while(node.right!=null){
                node=node.right;
            }
            parentNode.left=node;
            node.right=parentNode;
        }
        if(parentNode.right==node){
            while(node.left!=null){
                node=node.left;
            }
            parentNode.right=node;
            node.left=parentNode;
        }
        return parentNode;
    }
}

 

posted @ 2018-04-16 18:10  Allen101  阅读(132)  评论(0编辑  收藏  举报