1. 程式人生 > >LeetCode-Construct Binary Tree From Preorder And Postorder Traversal

LeetCode-Construct Binary Tree From Preorder And Postorder Traversal

一、Description

Return any binary tree that matches the given preorder and postorder traversals.

Values in the traversals pre and post are distinct positive integers.

題目大意:給定二叉樹的前序遍歷序列和後序遍歷序列,返回一個滿足這兩個序列的二叉樹,所有的結點值互不相同。

Example 1:

Input: pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
Output: 
[1,2,3,4,5,6,7]

二、Analyzation

對於兩個序列pre[a, b]和post[c, d],如果我們想通過這兩個序列重構一個二叉樹,顯然pre[a] = post[d],並且是根結點。

[root][......left......][...right..]  ---pre
[......left......][...right..][root]  ---post

pre[a + 1]是根結點的左子樹的根結點,找到這個結點在post中對應的下標,那麼左子樹的構建就是pre[a + 1, a + index - c + 1]和post[c, index]。


三、Accepted code

class Solution {
    Map<Integer, Integer> map = new HashMap<>();
    public TreeNode constructFromPrePost(int[] pre, int[] post) {
        for (int i = 0; i < post.length; i++) {
            map.put(post[i], i);
        }
        return help(pre, post, 0, pre.length - 1, 0, post.length - 1);
    }
    public TreeNode help(int[] pre, int[] post, int a, int b, int c, int d) {
        if (a > b || c > d) {
            return null;
        }
        TreeNode root = new TreeNode(pre[a]);
        if (a == b || c == d) {
            return root;
        }
        int index = map.get(pre[a + 1]);
        int len = index - c + 1;
        root.left = help(pre, post, a + 1, a + len, c, index);
        root.right = help(pre, post, a + len + 1, b, index + 1, d);
        return root;
    }
}