题目描述
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
解题思想
第一步:如果数组大小为零的话,说明是空节点了。
第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
第五步:切割后序数组,切成后序左数组和后序右数组
第六步:递归处理左区间和右区间
代码
class Solution {
public:
TreeNode* traversal(vector<int>& inorder, vector<int>& postorder){
//第一步
if(postorder.size() == 0) return nullptr;
//第二步 后序遍历数组最后一个元素,就是当前的中间节点
int nodeVal = postorder[postorder.size() - 1];
TreeNode* root = new TreeNode(nodeVal);
if(postorder.size() == 1) return root;
//第三部:找切割点
int index;
for(index = 0; index < inorder.size(); ++index){
if(inorder[index ] == nodeVal)
break;
}
//第四步:切割中序数组,得到中序做数组和中序右数组
vector<int> leftInorder(inorder.begin(), inorder.begin() + index);
//+1 是跳过分割点(已经构建的元素)
vector<int> rightInorder(inorder.begin()+index + 1, inorder.end());
// 第五步:切割后序数组,得到 后序左数组和后序右数组
postorder.resize(postorder.size() - 1);
vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
vector<int> rightPostorder(postorder.begin()+leftInorder.size(), postorder.end());
//第六步:递归处理左区间和右区间
root->left = traversal(leftInorder, leftPostorder);
root->right = traversal(rightInorder, rightPostorder);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return traversal(inorder, postorder);
}
};