前序中序建立二叉樹
阿新 • • 發佈:2018-12-09
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時,返回。
共勉:做題先想思路,後想實現方法,不可一起考慮!