LeetCode-Construct Binary Tree From Preorder And Postorder Traversal
阿新 • • 發佈:2018-11-01
一、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; } }