LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal

时间:2021-04-04 12:25:50

原题链接在这里:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/

题目:

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]

Note:

  • 1 <= pre.length == post.length <= 30
  • pre[] and post[] are both permutations of 1, 2, ..., pre.length.
  • It is guaranteed an answer exists. If there exists multiple answers, you can return any of them.

题解:

The first element in pre, 1 is actually the root's val. 

The second element in pre, 2 is root's left child val. Find 2's index in post, before that, all are root left subtree.

Vice Versa.

Use a HashMap to store post element and its index for quick search.

In recursion, before using pre[preL+1], be careful with OutOfBoundException. Return when preL == preR. This makes sure after that, preL will not be out of index bound.

Time Complexity: O(n).

Space: O(n).

AC Java:  

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     int val;
 5  *     TreeNode left;
 6  *     TreeNode right;
 7  *     TreeNode(int x) { val = x; }
 8  * }
 9  */
10 class Solution {
11     public TreeNode constructFromPrePost(int[] pre, int[] post) {
12         if(pre == null || pre.length == 0 || post == null || post.length == 0){
13             return null;
14         }
15         
16         HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
17         for(int i = 0; i<post.length; i++){
18             hm.put(post[i], i);
19         }
20         
21         return construct(pre, 0, pre.length-1, post, 0, post.length-1, hm);
22     }
23     
24     private TreeNode construct(int[] pre, int preL, int preR, int[] post, int postL, int postR, HashMap<Integer, Integer> hm){
25         if(preL > preR){
26             return null;
27         }
28         
29         TreeNode root = new TreeNode(pre[preL]);
30         if(preL == preR){
31             return root;
32         }
33         
34         int leftVal = pre[preL+1];
35         int leftIndex = hm.get(leftVal);
36         root.left = construct(pre, preL+1, preL+1+leftIndex-postL, post, postL, leftIndex, hm);
37         root.right = construct(pre, preL+2+leftIndex-postL, preR, post, leftIndex+1, postR-1, hm);
38         return root;
39     }
40 }

类似Construct Binary Tree from Preorder and Inorder TraversalConstruct Binary Tree from Inorder and Postorder Traversal.