資料結構——由中序與後序遍歷確定的二叉樹
阿新 • • 發佈:2018-11-28
由中序與後序遍歷確定的二叉樹
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 50 typedef struct Node{ //二叉樹的鏈式儲存結點 char data; struct Node *Lchild; struct Node *Rchild; }BiTNode,*BiTree; void Visit(char data){ printf("%c",data); } void PreOrder(BiTree T){ //先序遞迴遍歷 if(T){ Visit(T->data); PreOrder(T->Lchild); PreOrder(T->Rchild); } } void PostOrder(BiTree T){ //後序遞迴遍歷 if(T){ PostOrder(T->Lchild); PostOrder(T->Rchild); Visit(T->data); } } void InOrder(BiTree T){ //中序遞迴遍歷 if(T){ InOrder(T->Lchild); Visit(T->data); InOrder(T->Rchild); } } BiTree Construct(char *startIn,char *endIn,char *startPost,char *endPost){ //後序遍歷的最後一個必然是根結點 BiTree root=(BiTree)malloc(sizeof(BiTree)); root->data=*endPost; root->Lchild=NULL; root->Rchild=NULL; //遞迴終止條件:後序遍歷中只有一個結點 if(startPost==endPost) return root; //在中序遍歷中找到根結點 char *rootIn=startIn; while(rootIn<=endIn&&(*rootIn)!=root->data) rootIn++; int leftlen=rootIn-startIn;//左子樹的結點數 if(leftlen>0)//左子樹不為空,構造左子樹 root->Lchild=Construct(startIn,rootIn-1,startPost,startPost+leftlen-1); int rightlen=endIn-rootIn;//右子樹的結點數 if(rightlen>0)//右子樹不為空,構造右子樹 root->Rchild=Construct(rootIn+1,endIn,startPost+leftlen,endPost-1); return root; } BiTree Create(char *in,char *post,int len){ if(post==NULL || in==NULL || len<=0) return NULL; return Construct(in,in+len-1,post,post+len-1); } int main(){ BiTree T; char Post[MAXSIZE],In[MAXSIZE]; int n; for(int i=0;i<MAXSIZE;i++){ Post[i]='#'; In[i]='#'; } for(int j=0;j<MAXSIZE;j++){ //輸入中序序列 In[j]=getchar(); if(In[j]=='\n'){ In[j]='#'; break; } } for(int j=0;j<MAXSIZE;j++){ //輸入後序序列 Post[j]=getchar(); if(Post[j]=='\n'){ Post[j]='#'; n=j; break; } } char *post=Post;//先序序列 char *in=In;//中序序列 T=Create(in,post,n); PreOrder(T); return 0; }