返回与给定的前序和后序遍历匹配的任何二叉树。
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
的排列- 每个输入保证至少有一个答案。如果有多个答案,可以返回其中一个。
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/
思路
递归。
若要确定一个树的构造,必须有中序遍历,因此此题有多个答案,只需返回任意一个即可。
前序遍历规律:第一个值为root;
后序遍历规律:最后一个值为root。
因此树构造的分岔点在于:无法准确划分左右子树的界限。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* constructFromPrePost(vector<int>& pre, vector<int>& post) {
if(pre.size()==0 || pre.size()!=post.size()) return nullptr;
return getChild(pre, post, 0, pre.size()-1, 0, post.size()-1);
}
TreeNode* getChild(vector<int>& pre, vector<int>& post, int lpre, int rpre, int lpost, int rpost){
TreeNode* root = new TreeNode(pre[lpre]);
if(lpre<rpre){
int tmp = pre[lpre+1], lnum = 0;
while(post[lpost+lnum]!=tmp){
++lnum;
}
TreeNode* lchild = getChild(pre, post, lpre+1, lpre+lnum+1, lpost, lpost+lnum);
TreeNode* rchild = lpost+lnum<rpost-1? getChild(pre, post, lpre+lnum+2, rpre, lpost+lnum+1, rpost-1): nullptr;
root->left = lchild;
root->right = rchild;
}
return root;
}
};