根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
解析:本题与第105题的不同是给与的遍历序列由前序遍历变为了后序遍历,但是实现上基本相同,后序遍历的最后一个元素就是根节点值,因此将105题的正向遍历变为本题的反向遍历。
class Solution {
public:
int pos;
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
pos = postorder.size()-1;
return helper(inorder,postorder,0,pos+1);
}
TreeNode* helper(vector<int>& inorder,vector<int>& postorder,int start,int end){
if(start >= end || pos < 0) return nullptr;
TreeNode* cur = new TreeNode(postorder[pos]);
--pos;
int i;
for(i=start;i<end;++i){
if(inorder[i]==cur->val) break;
}
cur->right = helper(inorder,postorder,i+1,end);
cur->left = helper(inorder,postorder,start,i);
return cur;
}
};