题目
返回与给定的前序和后序遍历匹配的任何二叉树。
pre
和 post
遍历中的值是不同的正整数。
示例
输入:pre = [1,2,4,5,3,6,7], post = [4,5,2,6,7,3,1]
输出:[1,2,3,4,5,6,7]
提示:
1 <= pre.length == post.length <= 30
-
pre[] 和 post[] 都是 1, 2, ..., pre.length
的排列 - 每个输入保证至少有一个答案。如果有多个答案,可以返回其中一个。
题目链接
题目分析
这道题要求我们根据前序遍历和后序遍历构造二叉树。已知前序遍历的顺序是ulr,后序遍历的顺序是lru,所以前序遍历的第一个元素是根节点,后序遍历的最后一个元素也是根节点。
刨除根节点后,剩余序列均由l+r的顺序组成,我们只需要知道l或r的元素个数,就可以采用分治法递归的构建树。
以示例为例,我们简单分析一下这个过程,通过前序序列,我们可以知道左子树的头结点是2,我们可以在后序遍历序列中找到2,2之前的就是左子树,2之后的就是右子树。这样我们就可以确定左右子树的数量,可以分块进行建树操作了。
TreeNode* creTree(vector pre, int prel, int prer, vector post, int postl, int postr){
if (prel > prer || postl > postr) return NULL;
TreeNode* root = new TreeNode(pre[prel]);
if (prel == prer) return root;
int idx = 0;
while (pre[prel + 1] != post[idx]) idx++;
root->left = creTree(pre, prel + 1, idx - postl + prel + 1, post, postl, idx);
root->right = creTree(pre, idx - postl + prel + 2, prer, post, idx + 1, postr - 1);
return root;
}
题目解答
class Solution {
public:
TreeNode* creTree(vector pre, int prel, int prer, vector post, int postl, int postr){
if (prel > prer || postl > postr) return NULL;
TreeNode* root = new TreeNode(pre[prel]);
if (prel == prer) return root;
int idx = 0;
while (pre[prel + 1] != post[idx]) idx++;
root->left = creTree(pre, prel + 1, idx - postl + prel + 1, post, postl, idx);
root->right = creTree(pre, idx - postl + prel + 2, prer, post, idx + 1, postr - 1);
return root;
}
TreeNode* constructFromPrePost(vector& pre, vector& post) {
return creTree(pre, 0, pre.size() - 1, post, 0, post.size() - 1);
}
};