106. Construct Binary Tree from Inorder and Postorder Traversal(注意与105差别,下标)

Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

For example, given

inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]

Return the following binary tree:

    3
   / \
  9  20
    /  \
   15   7

 

class Solution {
private:
    unordered_map<int,int> index_map;
public:
    TreeNode* build(int post_left,int post_right, vector<int>& postorder, int in_left, int in_right,vector<int>& inorder) {
        if(post_left > post_right || in_left > in_right) return nullptr; 
        int inorder_index = index_map[postorder[post_right]];
        int left_length = inorder_index  - in_left;
        TreeNode* root = new TreeNode(postorder[post_right]);
        root->left = build(post_left,post_left+left_length-1,postorder,in_left,inorder_index-1,inorder);
        root->right= build(post_left+left_length,post_right-1,postorder,inorder_index+1,in_right,inorder);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder,vector<int>& postorder) {
        for(int i = 0; i < inorder.size(); ++i) {
            index_map[inorder[i]] = i;
        }
        return build(0,postorder.size()-1,postorder,0,inorder.size()-1,inorder);
    }
};

 

 

 1 class Solution {
 2     public TreeNode buildTree(int[] inorder, int[] postorder) {
 3         return help(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
 4     }
 5     private TreeNode help(int[] inorder,int in_start,int in_end,int[] postorder,int post_start,int post_end){
 6         if(in_start>in_end||post_start>post_end) return null;
 7         TreeNode root = new TreeNode(postorder[post_end]);
 8         int j = in_start;
 9         while(inorder[j]!=postorder[post_end]&& j <=in_end)
10             j++;
11         root.left = help(inorder,in_start,j-1,postorder,post_start,post_start+(j-in_start)-1);
12         root.right = help(inorder,j+1,in_end,postorder,post_end-(in_end-j),post_end-1);
13         return root;
14     }
15 }

 

posted @ 2018-01-29 21:15  乐乐章  阅读(198)  评论(0编辑  收藏  举报