資料結構——由前序與中序遍歷確定的二叉樹
阿新 • • 發佈: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 PostOrder(BiTree T){ //後序遞迴遍歷 if(T){ PostOrder(T->Lchild); PostOrder(T->Rchild); Visit(T->data); } } BiTree Construct(char *startPre,char *endPre,char *startIn,char *endIn){ //先序遍歷的第一個必然是根結點 BiTree root=(BiTree)malloc(sizeof(BiTree)); root->data=*startPre; root->Lchild=NULL; root->Rchild=NULL; //遞迴終止條件:先序遍歷中只有一個結點 if(startPre==endPre) return root; //在中序遍歷中找到根結點 char *rootIn=startIn; while(rootIn<=endIn&&(*rootIn)!=root->data) rootIn++; int leftlen=rootIn-startIn;//左子樹的結點數 if(leftlen>0)//左子樹不為空,構造左子樹 root->Lchild=Construct(startPre+1,startPre+leftlen,startIn,rootIn-1); int rightlen=endIn-rootIn;//右子樹的結點數 if(rightlen>0)//右子樹不為空,構造右子樹 root->Rchild=Construct(endPre-rightlen+1,endPre,rootIn+1,endIn); return root; } BiTree Create(char *pre,char *in,int len){ if(pre==NULL || in==NULL || len<=0) return NULL; return Construct(pre,pre+len-1,in,in+len-1); } int main(){ BiTree T; char Pre[MAXSIZE],In[MAXSIZE]; int n; for(int i=0;i<MAXSIZE;i++){ Pre[i]='#'; In[i]='#'; } for(int j=0;j<MAXSIZE;j++){ //輸入前序序列 Pre[j]=getchar(); if(Pre[j]=='\n'){ Pre[j]='#'; n=j; break; } } for(int j=0;j<MAXSIZE;j++){ //輸入中序序列 In[j]=getchar(); if(In[j]=='\n'){ In[j]='#'; break; } } char *pre=Pre;//先序序列 char *in=In;//中序序列 T=Create(pre,in,n); PostOrder(T); return 0; }