leetcode106. 从中序与后序遍历序列构造二叉树 medium
题目描述:
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
解题思路:
跟105题一样,同样没有重复元素,而中序:左中右,后序:左右中,所以后序数组的最后一个元素必是根元素,而根据这个根元素的值,我们可以找到中序的左右子树。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.empty() || postorder.empty() || inorder.size() != postorder.size())
return nullptr;
return core(inorder,0,inorder.size()-1,postorder,0,postorder.size()-1);
}
TreeNode* core(vector<int> &inorder,int ileft,int iright,
vector<int> &postorder,int pleft,int pright){
if(ileft>iright )
return nullptr;
int ptr=0;
for(;(ileft+ptr)<=iright;++ptr){
if(inorder[ileft+ptr]==postorder[pright])
break;
}
TreeNode *root=new TreeNode(postorder[pright]);
root->left=core(inorder,ileft,ileft+ptr-1,postorder,pleft,pleft+ptr-1);
root->right=core(inorder,ileft+ptr+1,iright,postorder,pleft+ptr,pright-1);
return root;
}
};