一、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;
}
}