已知先序+中序構造二叉樹,已知後序+中序構造二叉樹(C語言)
阿新 • • 發佈:2019-01-24
程式碼如下:
#include<stdio.h> #include<stdlib.h> typedef struct Bitree{ char data; struct Bitree *lchild; struct Bitree *rchild; }Bitree,*Bi; void PreOrder(Bitree *p); void MidOrder(Bitree *p); void PostOrder(Bitree *p); void print(Bitree *Troot); void midprecreat(Bi &Node,char mid[],char pre[],int lm,int rm,int lp,int rp) {//中序加先序建立 Node=(Bi)malloc(sizeof(Bitree)); Node->data=pre[lp]; Node->lchild=NULL; Node->rchild=NULL; int pos=lm; while(mid[pos]!=pre[lp]) pos++; int childlen=pos-lm;//用來控制子樹在字串中的範圍 if(pos>lm)//有左子樹,遞迴建立 midprecreat(Node->lchild,mid,pre,lm,pos-1,lp+1,lp+childlen); if(pos<rm)//有右子樹,遞建立 midprecreat(Node->rchild,mid,pre,pos+1,rm,lp+childlen+1,rp); } void midpostcreat(Bi &Node,char mid[],char post[],int lm,int rm,int lp,int rp) {//中序+後序建立 Node=(Bi)malloc(sizeof(Bitree)); Node->data=post[rp]; Node->lchild=NULL; Node->rchild=NULL; int pos=lm; while(mid[pos]!=post[rp]) pos++; int childlen=pos-lm;//用來控制子樹在字串中的範圍 if(pos>lm)//有左子樹,遞迴建立 midpostcreat(Node->lchild,mid,post,lm,pos-1,lp,lp+childlen-1); if(pos<rm)//有右子樹,遞建立 midpostcreat(Node->rchild,mid,post,pos+1,rm,lp+childlen,rp-1); } int main() { char pre[100]; //儲存先序序列 char mid[100]; //儲存中序序列 char post[100]; //儲存後序序列 int n; Bitree *Troot; printf("程式1請輸入節點個數\n"); scanf("%d",&n); getchar(); printf("輸入二叉樹的中序與先序序列,求後序序列\n"); gets(mid); gets(pre); midprecreat(Troot,mid,pre,0,n-1,0,n-1); print(Troot); printf("程式2 請輸入節點個數\n"); scanf("%d",&n); getchar(); printf("輸入二叉樹的中序與後序序列,求先序序列\n"); gets(mid); gets(post); midpostcreat(Troot,mid,post,0,n-1,0,n-1); print(Troot); return 0; } void print(Bitree *Troot) { printf("先序遍歷結果:\n"); PreOrder(Troot); printf("\n"); printf("中序遍歷結果:\n"); MidOrder(Troot); printf("\n"); printf("後序遍歷結果:\n"); PostOrder(Troot); printf("\n"); } //先序遍歷 void PreOrder(Bitree *p) { if(p != NULL) { printf("%c ",p->data); //輸出該結點 PreOrder(p->lchild); //遍歷左子樹 PreOrder(p->rchild); //遍歷右子樹 } } //中序遍歷 void MidOrder(Bitree *p) { if(p != NULL) { MidOrder(p->lchild); //遍歷左子樹 printf("%c ",p->data); //輸出該結點 MidOrder(p->rchild); //遍歷右子樹 } } //後序遍歷 void PostOrder(Bitree *p) { if(p != NULL) { PostOrder(p->lchild); //遍歷左子樹 PostOrder(p->rchild); //遍歷右子樹 printf("%c ",p->data); //輸出該結點 } }