递归(每层递归定义了新的vector)
- 如果数组长度为0,则说明是空节点
- 如果数组长度不为0,将后序数组最后一个元素作为节点元素
- 找到节点元素在中序数组中的位置,作为切割点【delimitIndex】
- 切割中序数组:中序左数组【[0,delimitIndex)】;中序右数组【[delimitIndex+1,end)】
- 切割后序数组:舍弃后序末尾元素【postorder.resize(postorder.size()-1);】;后序左数组【[0,inorderleft.size())】;后序右数组【inorderleft.size(),end】
- 递归左右
class Solution {
private:
TreeNode* traversal(vector<int>& inorder, vector<int>& postorder){
if(postorder.size()==0) return nullptr;
int rootValue=postorder[postorder.size()-1];
TreeNode* root=new TreeNode(rootValue);
if(postorder.size()==1) return root;
int delimitIndex;
for(delimitIndex=0;delimitIndex<inorder.size();delimitIndex++){
if(inorder[delimitIndex]==rootValue) break;
}
vector<int> inorderleft(inorder.begin(),inorder.begin()+delimitIndex);
vector<int> inorderright(inorder.begin()+delimitIndex+1,inorder.end());
postorder.resize(postorder.size()-1);
vector<int> postorderleft(postorder.begin(),postorder.begin()+inorderleft.size());
vector<int> postorderright(postorder.begin()+inorderleft.size(),postorder.end());
root->left=traversal(inorderleft,postorderleft);
root->right=traversal(inorderright,postorderright);
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size()==0||postorder.size()==0) return nullptr;
return traversal(inorder,postorder);
}
};
递归(使用下标分割数组)
class Solution {
private:
TreeNode* traversal(vector<int>& inorder,int inorderbegin,int inorderend,vector<int>& postorder,int postorderbegin,int postorderend){
if(postorderbegin==postorderend) return nullptr;
int rootValue=postorder[postorderend-1];
TreeNode* root=new TreeNode(rootValue);
if(postorderend-postorderbegin==1) return root;
int delimitIndex;
for(delimitIndex=inorderbegin;delimitIndex<inorderend;delimitIndex++){
if(inorder[delimitIndex]==rootValue) break;
}
int inorderleftbegin=inorderbegin;
int inorderleftend=delimitIndex;
int inorderrightbegin=delimitIndex+1;
int inorderrightend=inorderend;
int postorderleftbegin=postorderbegin;
int postorderleftend=postorderbegin+delimitIndex-inorderbegin;
int postorderrightbegin=postorderbegin+(delimitIndex-inorderbegin);
int postorderrightend=postorderend-1;
root->left=traversal(inorder,inorderleftbegin,inorderleftend,postorder,postorderleftbegin,postorderleftend);
root->right=traversal(inorder,inorderrightbegin,inorderrightend,postorder,postorderrightbegin,postorderrightend);
return root;
}
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size()==0||postorder.size()==0) return nullptr;
return traversal(inorder,0,inorder.size(),postorder,0,postorder.size());
}
};