题目链接
class Solution {
public:
TreeNode* travel(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 inNodeIndex;
for (int i = inorderBegin; i < inorderEnd; i++) {
if (inorder[i] == rootValue) {
inNodeIndex = i;
break;
}
}
int leftInorderBegin = inorderBegin;
int leftInorderEnd = inNodeIndex;
int rightInorderBegin = inNodeIndex + 1;
int rightInorderEnd = inorderEnd;
int leftPostorderBegin = postorderBegin;
int leftPostorderEnd = postorderBegin + (inNodeIndex-leftInorderBegin);
int rightPostorderBegin = postorderBegin + (inNodeIndex-leftInorderBegin);
int rightPostorderEnd = postorderEnd - 1;
root->left = travel(inorder, leftInorderBegin, leftInorderEnd,
postorder, leftPostorderBegin, leftPostorderEnd);
root->right = travel(inorder, rightInorderBegin, rightInorderEnd,
postorder, rightPostorderBegin, rightPostorderEnd);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int inSize = inorder.size();
int postSize = postorder.size();
if (inSize == 0 || postSize == 0)
return nullptr;
return travel(inorder, 0, inSize, postorder, 0, postSize);
}
};
总结
- 找到分割节点,区间使用左闭右开
- 不创建新的数组,在原数组上进行分割,新的左右数组起止下标需要改变,不是从0开始了
- 使用后序的起止判断是否为空还是只有一个节点了