题目来源:
描述
给定节点数为 n 二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。
提示:
1.vin.length == pre.length
2.pre 和 vin 均无重复元素
3.vin出现的元素均出现在 pre里
4.只需要返回根结点,系统会自动输出整颗树做答案对比
数据范围:n \le 2000n≤2000,节点的值 -10000 \le val \le 10000−10000≤val≤10000
要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
我的代码:
递归方法进行二叉树重建:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *root;
vector<int> p,v;
TreeNode* build(int lp, int rp, int lv, int rv){
if(rp<lp) return nullptr;
TreeNode* ne=new TreeNode(p[lp]);
int index=lv;//在中序遍历中找到对应的值
while(index<=rv && ne->val != v[index]){
index++;
}
//左节点
ne->left = build(lp+1,lp+index-lv,lv,index-1);
//右节点
ne->right = build(lp+index-lv+1,rp,index+1,rv);
return ne;
}
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
p=pre;
v=vin;
root=build(0,p.size()-1,0,v.size()-1);
return root;
}
};
题解:
也是采用递归方法,思路是一致的。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
// 判断这个二叉树的节点是否已经是叶子节点了
if(pre.size()==0||vin.size()==0){
return NULL;
}
// 不是叶子节点就进行向下递归的操作
TreeNode* root=new TreeNode(pre[0]);
for(int i=0;i<vin.size();i++){
// 找到和当前的先序遍历的头节点权值一样的节点
if(root->val==vin[i]){
// 找到之后就利用中序遍历的序列将这个序列分为左右子序列
vector<int> pre1,pre2,vin1,vin2;
for(int j=1;j<i+1;j++){
pre1.push_back(pre[j]);
}
for(int j=0;j<i;j++){
vin1.push_back(vin[j]);
}
for(int j=i+1;j<pre.size();j++){
pre2.push_back(pre[j]);
}
for(int j=i+1;j<vin.size();j++){
vin2.push_back(vin[j]);
}
// 进行递归的操作
root->left=reConstructBinaryTree(pre1,vin1);
root->right=reConstructBinaryTree(pre2,vin2);
break;
}
}
return root;
}
};