轉載-由中序和後續序列建立二叉樹
阿新 • • 發佈:2019-02-09
已知某二叉樹具有n(n>0)個不同的節點,其中序序列是a0a1…an-1,後序序列是b0b1…bn-1。
因為在後序遍歷過程中,先遍歷左子樹,再遍歷右子樹,最後訪問根節點。所以,bn-1必定是二叉樹的根節點,而且bn-1也必定在中序序列中出現。也就是說在中序序列中有某個ak(0<=k<=n-1)就是根節點。
由於ak是根節點,而且中序遍歷過程中,先遍歷左子樹,再訪問根節點,最後遍歷右子樹,所以在中序序列中,a0a1…ak-1必定是根節點ak左子樹的中序序列,即ak的左子樹有k個節點。而ak+1…an-1比是根節點ak的右子樹的中序序列,即ak的右子樹有n-k-1個節點。
另外在後序序列中,在根節點bn-1之前的n-k-1個節點bk…bn-2就是右子樹的後序序列,b0…bk-1是左子樹的後序序列。
前面所述,也可作為證明 “任何n(n>0)個不同節點的二叉樹,都可以由它的中序序列和後序序列唯一地確定” 的方法。
[cpp] view plain copy print?[cpp] view plain copy print?- /*
- * post 存放後序序列
- * in 存放中序序列
- * n in中字元個數
- * m 二叉樹中節點總個數
- */
- BTNode *CreateBT(char *post, char *in,
- {
- BTNode *s;
- char *p, *q, *maxp;
- int maxpost, maxin, k;
- if( n <= 0) return NULL;
- maxpost = -1;
- for( p=in; p<in+n; p++){ /*求in字元在post中最右邊的那個字元,\n*/
- for( q=post; q<post+n; q++){ /*在in中用maxp指向這個字元,用maxin標示它在in中的下標*/
- if( *p == *q){
- k = q-post;
- if( k > maxpost ){
- maxpost = k;
- maxp = p;
- maxin = p-in;
- }
- }
- }
- }
- s = (BTNode *)malloc(sizeof(BTNode));
- s->data = post[maxpost];
- s->lchild = CreateBT(post, in, maxin, m);
- s->rchild = CreateBT(post, maxp+1, n-maxin-1, m);
- return s;
- }
/* * post 存放後序序列 * in 存放中序序列 * n in中字元個數 * m 二叉樹中節點總個數 */ BTNode *CreateBT(char *post, char *in, int n, int m) { BTNode *s; char *p, *q, *maxp; int maxpost, maxin, k; if( n <= 0) return NULL; maxpost = -1; for( p=in; p<in+n; p++){ /*求in字元在post中最右邊的那個字元,\n*/ for( q=post; q<post+n; q++){ /*在in中用maxp指向這個字元,用maxin標示它在in中的下標*/ if( *p == *q){ k = q-post; if( k > maxpost ){ maxpost = k; maxp = p; maxin = p-in; } } } } s = (BTNode *)malloc(sizeof(BTNode)); s->data = post[maxpost]; s->lchild = CreateBT(post, in, maxin, m); s->rchild = CreateBT(post, maxp+1, n-maxin-1, m); return s; }[cpp] view plain copy print?