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 = [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.

Runtime: 20 ms, faster than 10.38% of C++ online submissions for Construct Binary Tree from Preorder and Postorder Traversal.

想用map优化查找left root的速度,结果更慢了....

#include <assert.h>
class Solution {
private:
  unordered_map<int,int>mp;
public:
  TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) {
    for(int i=0; i<post.size(); i++) mp[post[i]] = i;
    return helper(pre, post, 0, pre.size()-1, 0, post.size()-1);
  }
  TreeNode* helper(vector<int>& pre, vector<int>& post, int pres, int pree, int poss, int pose){
    if(pres > pree || poss > pose) return nullptr;
    assert(pre[pres] == post[pose]);
    int rootval = pre[pres];
    TreeNode* root = new TreeNode(rootval);
    if(pres == pree && poss == pose) return root;
    int leftidx = mp[pre[pres+1]];
    int leftlength = leftidx - poss + 1;
    int leftpose = pres + leftlength;
    root->left = helper(pre, post, pres+1, leftpose, poss, leftidx);
    root->right = helper(pre, post, leftpose+1, pree, leftidx+1, pose-1);
    return root;
  }
};

 

相关文章:

  • 2022-01-23
  • 2022-02-01
  • 2021-08-30
  • 2021-11-20
  • 2021-10-24
  • 2021-09-29
猜你喜欢
  • 2021-10-30
  • 2022-02-13
  • 2022-01-09
  • 2021-11-21
  • 2022-03-04
相关资源
相似解决方案