原题:
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
这个题其实不算难,就是在边界判断的时候较麻烦
对每个中序遍历inOrder和后续遍历postOrder而言,
1 postOrder[last] 就是树的根
2 假设这个根在中序是第i个,则i前的都是根的左子树,i后都是根的右子树
3 这里和之前用的不太一样,返回一个TreeNode*,把root的left,right指向一个函数即可,可以比较一下两种方法Convert Sorted Array to Binary Search Tree
如图所示
代码(128ms):
class Solution {
public:
TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
return recover(inorder,0, inorder.size()-1, postorder ,0, postorder.size()-1);
}
TreeNode* recover(vector<int> &inorder, int inStart, int inEnd, vector<int> &postorder ,int poStart, int poEnd){
if(inStart > inEnd) return NULL;
int root = postorder[poEnd];
int pos = 0;//root前有pos个前序的
for(int i= 0;i<=inEnd-inStart;i++){
if(inorder[inStart+i] == root){
pos = i;
break;
}
}
TreeNode * node = new TreeNode(root);
node->left = recover(inorder , inStart , inStart+pos-1 , postorder, poStart , poStart+pos-1);
node->right = recover(inorder , inStart+pos+1 , inEnd , postorder, poStart+pos , poEnd-1);
return node;
}
};