105. Construct Binary Tree from Preorder and Inorder Traversal

分治法后序遍历建树

对数组, 输入值为数组(起始点和终止点控制数组的长度和节点的值---去掉用过的点的位置) :

1递归出口,   if (prestart > preend || instart > inend) return null;

2构造节点, 根据数组的某个位置

3操作数组的长度, 起始点和终止点--> 为了下一个节点

4分治法建立子节点关系, 改变输入值的数组的起始点和终止点(控制数组的长度和节点的值---去掉用过的点的位置) :

5后序遍历返回root

public TreeNode buildTree(int[] preorder, int[] inorder) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < inorder.length; i++) {
            map.put(inorder[i], i);
        }
        return help(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1, map);
    }
    private TreeNode help(int[] preorder, int[] inorder, 
                          int prestart, int preend, int instart, int inend, Map map){
        if (prestart > preend || instart > inend) return null;
        TreeNode root = new TreeNode(preorder[prestart]);
        int pos = (int)map.get(root.val);
        int gap = pos - instart;
        root.left = help(preorder, inorder, prestart + 1, prestart + gap, instart, pos - 1, map);
        root.right = help(preorder, inorder, prestart + 1 + gap, preend, pos + 1, inend, map);
        return root;
    }
}

围绕构建节点值, 和递归的输入值的起始点和终止点上面

posted @ 2017-08-01 19:51  apanda009  阅读(193)  评论(0编辑  收藏  举报