vector版:直接上c++代码,讲解在下面,一定要看哦!
struct node{
node *l, *r;
int val;
node(int x) : val(x), l(NULL), r(NULL) {}
};
node* reBuild(vector<int> pre, vector<int> in){
vector<int> lPre, rPre, lIn, rIn;
int pos = 0;
int len = in.size();
if(len == 0)
return NULL;
node* cur = new node(pre[0]);
for(int i = 0; i < len; i++){
if(pre[0] == in[i]){
pos = i;
break;
}
}
for(int i = 1; i < pos+1; i++){
lPre.push_back(pre[i]);
lIn.push_back(in[i-1]);
}
for(int i = pos+1; i < len; i++){
rPre.push_back(pre[i]);
rIn.push_back(in[i]);
}
cur->l = reBuild(lPre, lIn);
cur->r = reBuild(rPre, rIn);
return cur;
}
一定不要死记硬背,跟随我的思路来理解:
第一步,因为我们要建树,所以函数的范围值是一个节点指针。
第二步,因为模拟手动建树,需要的参数就是前序遍历和中序遍历的序列,所以参数是pre,in。
第三步,根据分治法原理,递归地去建立当前节点的左子树和右子树,此处就是递归的入口(两个)。
第四步,设定递归出口,当前序或者中序遍历的长度为0时,返回。
共勉:做题先想思路,后想实现方法,不可一起考虑!