《二叉树的建立及几种简单的遍历方法》由会员分享,可在线阅读,更多相关《二叉树的建立及几种简单的遍历方法(8页珍藏版)》请在金锄头文库上搜索。
1、incl tdio.h#ncude sdlib.hef STACKINT_IZE10/栈存储空间初始分派量efine STACICRMET 10 /存储空间分派增量/-二叉树的存储构造表达-/ypdetru BiTNodein dat;truct BTode *lchld,*rchild;BiTNde,*BiTre;/-顺序栈的存储构造表达-/typedef structBiTre *top;iTre *ase;n stacksize;Sack; /*/构造一种空栈sqtack IniSack();/创立一颗二叉树 iTree CrtBiTree();/判断栈空 t StackEmty(SqS
2、tck *);/插入元素e为新的栈顶元素 void Psh(qSack *,iTe p);/若栈不为空,则删除s栈顶的元素e,将插入到链表L中 void Pp(Sac S,BTee*q);/非递归先序遍历二叉树 void PreOdeTraee(BiTreeL);/非递归中序遍历二叉树 v InOrrTraverse(BiTee L);/非递归后序遍历二叉树 vod PosOreraverse(BiTre );/递归后序遍历二叉树 oi ostOrder(BiTrebt);/递归中序遍历二叉树 vidIrdr(iTrbt);/递归先序遍历二叉树 vd reOrer(iTree t);/*nt
3、n()BiTreebt; n,k;prntf(reat Tree ad te endwth );btCetBTree(); /创立二叉树opritf(1.PreOrderrvers2.InOrderTvere.ostdraverse4.PoOrder5.nOder 6.PrOrde);printf(plasenput num to n:);sca(%d,n);itch(n)ce 1:PeOrdrTarse(b);prinf(n);brek; /先序遍历非递归算法cas 2:InOrdrTravrse(bt);prntf(n);break; 中序非递归遍历算法case:PtrerTaves(bt
4、);nt(n); reak; /后序非递归遍历算法cae4:PostOrde(bt);rintf(n);brk; /后序递归遍历算法case : InOrder(b);prif(n);brea; /中序递归遍历算法cae 6: PrOrder(b);pritf(n);reak; /先序递归遍历算法print(iy want tcontinue,laseinpt a um0 to k:);cnf(d,&);while(k0);retun ;qStack IntSck() /构造一种空栈Sqck S;S=(SSack *)aoc(size(qSta));S-base=(BiTree *)mallo
5、c(STACKINIT_IZ*sizeof (iTee);S-oS-base;S-sacksze CK_INIT_SZE;retrn S;BiTe CeatBiTree() /先序方式递归方式建立一种二叉树har k;BiTee T;k=etchr();f(k=.)TUL;elsT(BiTNoe *)alc(izeof(BiTNoe);T-datak;T-lchi=Catree();T-rcld=CeaBTree();retnT; vod Pus(qtak *,BTe) /插入二叉树的结点地址为栈顶的新元素if(S-tp-S-as=S-sacsze)S-ae=(BiTre*)eal(S-bas
6、e,(S-stacksie+SACKINCRENT)*ief(iTee);S-topS-e+S-stacsie;Sstacksize=STACKIT;*S-top=p;S-p+;vid Pp(Sqck *S,iTree*q) /二叉树的结点地址出栈返回,做为新二叉树的目前地址if(S-base=-top)exit(0);-o-;*q=*S-tp;it StackEmpty(SqStack S) / 若栈S为空栈,则返回,否则返回0 i(S-top= e) reurn1;se rturn 0;od PrerdrTrarse(Bire L) /非先序遍历二叉树Be T;Sqtack *S;=Ini
7、tStack();=L;while(!SckEmpty()|T!=ULL)if(T!=NLL)rnf(%c,-daa);Push(S,T); T=T-lcid; /根指针进栈,遍历左子树lse /根指针退栈,访问根结点,遍历右子树Pp(S,&);T=Trchild;void nOrerTravers(iTree L) /非先序遍历二叉树iTre T;qSta *S;S=InitStak();T=L;wil(!StackEmpty(S)|T!NUL)i(T!=NUL)Push(S,T);T=lcild; /根指针进栈,遍历左子树ee 根指针退栈,访问根结点,遍历右子树Pp(S,&);prin(%
8、,T-data);=rcd;voidPsOrdrTare(iTee )/非后序遍历二叉树Bee T;qSa *S;=IitSac();=;while(!akEty(S)|T!ULL)if(T!=ULL)Psh(S,T); T-lcld; /根指针进栈,遍历左子树else /根指针退栈,访问根结点,遍历右子树Po(S,);pitf(c,Tdata);T=-rcld;id Pstder(BiTeebt)if(t=NULL)retur;osOder(t-lhild);PostOrde(btrchil);printf(%c,btdata);void IOdr(iTree bt)if(b=NLL)retr;InOrde(t-lchild);prin(%,t-ta);nrder(b-rchd);od Pre(ir bt)f(bt=NLL)return;prntf(,bt-data);PreOrd(b-lcil);Prerder(btrcild);