2023.7.8
让我很难受的一道题,个人感觉难度不止中等。 首先要知道的是知道了前序/后序 + 中序 之后,是可以构造出相应且唯一的二叉树的。
本道题的思路通过递归的方式根据中序遍历数组和后序遍历数组构建二叉树,并返回根节点。递归的结束条件是中序遍历数组(也可以是后序遍历数组,这两数组长度始终相同)为空或长度为 1。 细节都在代码里了 ,下面看代码:
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.size()==0) return NULL;
//确定根节点,即后序遍历数组的最后一个元素。
int rootvalue = postorder[postorder.size()-1];
TreeNode* root = new TreeNode(rootvalue);
if (inorder.size() == 1) return root;
//找到中序遍历数组的切割点。
int seg;
for(seg=0; seg<inorder.size(); seg++)
{
if(inorder[seg] == rootvalue) break;
}
//切割中序遍历数组的左右数组
vector<int> in_left(inorder.begin(),inorder.begin()+seg);
vector<int> in_right(inorder.begin()+seg+1,inorder.end());
//切割后序遍历数组的左右数组
postorder.resize(postorder.size()-1);//将根节点去掉
vector<int> post_left(postorder.begin(),postorder.begin()+in_left.size());
vector<int> post_right(postorder.begin()+in_left.size(),postorder.end());
//递归处理左区间和右区间
root->left = buildTree(in_left,post_left);
root->right = buildTree(in_right,post_right);
return root;
}
};
日后再回来二刷。