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 }