题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
我使用的是递归,一直把递归边界写错
正确代码:
/**
* 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) {
TreeNode *tree1=(TreeNode *)malloc(sizeof(TreeNode));
return tree(pre,vin,0,pre.size()-1,0,vin.size()-1);
}
TreeNode *tree(vector<int> a,vector<int> b,int a1,int a2,int b1,int b2){
if (a2<a1){
return NULL;
}
if (a2-a1==0){
TreeNode *tree3=(TreeNode *)malloc(sizeof(TreeNode));
tree3->val=a[a1];
tree3->left=NULL;
tree3->right=NULL;
return tree3;
}
for (int x=0;x<=(a2-a1);x++){
if (a[a1]==b[b1+x]){
TreeNode *tree4=(TreeNode *)malloc(sizeof(TreeNode));
tree4->val=a[a1];
tree4->left=tree(a,b,a1+1,a1+x,b1,b1+x-1);
tree4->right=tree(a,b,a1+1+x,a2,b1+x+1,b2);
return tree4;
}
}
return NULL;
}
};
吃完零食之后,我觉得应该没必要加最后的return NULL;不知道是哪里错的,先自己删除代码:
我把判断a1==a2的代码删掉,依然成功,是下面代码:
/**
* 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) {
TreeNode *tree1=(TreeNode *)malloc(sizeof(TreeNode));
return tree(pre,vin,0,pre.size()-1,0,vin.size()-1);
}
TreeNode *tree(vector<int> a,vector<int> b,int a1,int a2,int b1,int b2){
if (a2<a1){
return NULL;
}
TreeNode *tree4=(TreeNode *)malloc(sizeof(TreeNode));
for (int x=0;x<=(a2-a1);x++){
if (a[a1]==b[b1+x]){
tree4->val=a[a1];
tree4->left=tree(a,b,a1+1,a1+x,b1,b1+x-1);
tree4->right=tree(a,b,a1+1+x,a2,b1+x+1,b2);
break;
}
}
return tree4;
}
};