1建立含有n个结点的二叉树链表2按照先序中序后序遍历的顺序依次输出二叉树的各个结点。

龚小澎 2019-12-21 18:35:00

推荐回答

#include#include#include#defineTRUE1#defineFALSE0#defineOK1#defineERROR0#defineINFEASIBLE-1#defineOVERFLOW-2typedefintStatus;typedefcharelemtype;typedefstructBiTNode{elemtypedata;structBiTNode*lchild,*rchild;}BiTNode,*BiTree;//构造二叉树StatusCreateBiTreeBiTree&T{elemtypech;ch=getchar;ifch==''''{T=NULL;}else{if!T=BiTNode*mallocsizeofBiTNodereturnFALSE;T->data=ch;CreateBiTreeT->lchild;CreateBiTreeT->rchild;}returnOK;}//先序遍历voidPreOrderTraverseBiTreeT{ifT!=NULL{printf"%c",T->data;PreOrderTraverseT->lchild;PreOrderTraverseT->rchild;}}//叶子节点的个数StatusLeafnumberBiTreeT{intnum1=0,num2=0;ifT==NULLreturn0;elseifT->lchild==NULL&&T->rchild==NULLreturn1;else{num1=LeafnumberT->lchild;num2=LeafnumberT->rchild;returnnum1+num2;}}//树的深度StatusDepthTreeBiTreeT{intllength=0,rlength=0;ifT==NULLreturn0;else{llength=DepthTreeT->lchild;rlength=DepthTreeT->rchild;returnllength>rlength?llength+1:rlength+1;}}voidmain{BiTrees;printf"输入字符串,使用空格代表空";CreateBiTrees;printf"先序输出:";PreOrderTraverses;printf"树的深度:%d",DepthTrees;getch;。
赵香福2019-12-21 19:39:26

提示您:回答为网友贡献,仅供参考。

其他回答

  • 算法如下:#include"stdio.h"#include"malloc.h"#defineELEMTYPEchartypedefstructBiTNode{ELEMTYPEdata;structBiTNode*lchild,*rchild;}BiTNode;BiTNode*bulid/*建树*/{BiTNode*q;BiTNode*s;}voidpreoderBiTNode*bt/*先序遍历*/{ifbt!=NULL{printf"%c",bt->data;preoderbt->lchild;preoderbt->rchild;}}voidInOrderBiTNode*bt/*中序遍历*/{ifbt!=NULL{InOrderbt->lchild;printf"%c",bt->data;InOrderbt->rchild;}}voidpostOrderBiTNode*bt/*后序遍历*/{ifbt!=NULL{postOrderbt->lchild;postOrderbt->rchild;printf"%c",bt->data;}}main{inta;BiTNode*bt;bt=bulid;k1:printf"需要先序遍历输出请输入1,中序遍历请输入2,后序遍历请输入3,结束输入0:";scanf"%d",&a;switcha{case1:preoderbt;gotok1;case2:InOrderbt;gotok1;case3:postOrderbt;gotok1;case0:break;}。
    齐明浩2019-12-21 19:58:17
  • 以下是程序代码,里面还包括求树的深度和叶子,已经运行通过了。include#include#include#defineMax20//结点的最大个数typedefstructnode{chardata;structnode*lchild;structnode*rchild;}BTNode;//自定义二叉树的结点类型typedefBTNode*BTree;//定义二叉树的指针intNodeNum,leaf;//NodeNUm为结点数,leaf为叶子数BTreeCreatBTreevoid{BTreeT;charch;ifch=getchar==''#''returnNULL;//读入#,返回空指针else{T=BTNode*mallocsizeofBTNode;//生成结点T->data=ch;T->lchild=CreatBTree;//构造左子树T->rchild=CreatBTree;//构造右子树returnT;}}voidPreorderBTreeT//先序遍历{ifT{printf"%c",T->data;//访问结点PreorderT->lchild;//先序遍历左子树PreorderT->rchild;//先序遍历右子树}}voidInorderBTreeT//中序遍历{ifT{InorderT->lchild;//中序遍历左子树printf"%c",T->data;//访问结点InorderT->rchild;//中序遍历右字树}}voidPostorderBTreeT//后序遍历{ifT{PostorderT->lchild;PostorderT->rchild;printf"%c",T->data;}}intTreeDepthBTreeT//后序遍历求二叉树的深度,结点数和叶子数{inthl,hr,max;ifT{hl=TreeDepthT->lchild;//求左深度hr=TreeDepthT->rchild;//求右深度max=hl>hr?hl:hr;//取左右深度的最大值NodeNum=NodeNum+1;//求结点数ifhl==0&&hr==0leaf=leaf+1;returnmax+1;}elsereturn0;}voidLevelorderBTreeT//层次遍历二叉树{intfront=0,rear=1;BTNode*cq=p->rchild;//右子树入队}}}voidmain{BTreeroot;inti,depth;printf"";printf"创建二叉树,请输入完全二叉树的先序序列,用#代表虚结点:";root=CreatBTree;//返回根结点do{printf"********************SELECT********************";printf" 1:先序遍历";printf" 2:中序遍历";printf" 3:后序遍历";printf" 4:深度、结点数、叶子数";printf" 5:层次遍历";printf"备注:选择层次遍历之前,需要先选择4,求出该树的结点数。printf" 0:Exit";printf" *********************************************";scanf"%d",&i;//输入菜单序号switchi{case1:printf"先序遍历结果为:";Preorderroot;break;case2:printf"中序遍历结果为:";Inorderroot;break;case3:printf"后序遍历结果为:";Postorderroot;break;case4:depth=TreeDepthroot;printf"深度=%d结点数=%d",depth,NodeNum;printf"叶子数=%d",leaf;break;case5:printf"层次遍历为:";Levelorderroot;break;default:exit1;}printf"";}whilei!=0;。
    齐晓同2019-12-21 19:15:11
  • 文件main.cpp代码如下:#include//malloc等#include//标准输入输出头文件,包括EOF=^Z或F6,NULL等#include//atoi,exit#include//数学函数头文件,包括floor,ceil,abs等#defineClearBiTreeDestroyBiTree//清空二叉树和销毁二叉树的操作一样typedefstructBiTNode{intdata;//结点的值BiTNode*lchild,*rchild;//左右孩子指针}BiTNode,*BiTree;intNil=0;//设整型以0为空voidvisitinte{printf"%d",e;//以整型格式输出}voidInitBiTreeBiTree&T{//操作结果:构造空二叉树TT=NULL;}voidCreateBiTreeBiTree&T{//算法6.4:按先序次序输入二叉树中结点的值可为字符型或整型,在主程中定义,//构造二叉链表表示的二叉树T。变量Nil表示空子树。修改intnumber;scanf"%d",&number;//输入结点的值ifnumber==Nil//结点的值为空T=NULL;else//结点的值不为空{T=BiTreemallocsizeofBiTNode;//生成根结点if!TexitOVERFLOW;T->data=number;//将值赋给T所指结点CreateBiTreeT->lchild;//递归构造左子树CreateBiTreeT->rchild;//递归构造右子树}}voidDestroyBiTreeBiTree&T{//初始条件:二叉树T存在。操作结果:销毁二叉树TifT//非空树{DestroyBiTreeT->lchild;//递归销毁左子树,如无左子树,则不执行任何操作DestroyBiTreeT->rchild;//递归销毁右子树,如无右子树,则不执行任何操作freeT;//释放根结点T=NULL;//空指针赋0}}voidPreOrderTraverseBiTreeT,void*Visitint{//初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1//操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次ifT//T不空{VisitT->data;//先访问根结点PreOrderTraverseT->lchild,Visit;//再先序遍历左子树PreOrderTraverseT->rchild,Visit;//最后先序遍历右子树}}voidInOrderTraverseBiTreeT,void*Visitint{//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次ifT{InOrderTraverseT->lchild,Visit;//先中序遍历左子树VisitT->data;//再访问根结点InOrderTraverseT->rchild,Visit;//最后中序遍历右子树}}voidPostOrderTraverseBiTreeT,void*Visitint{//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次ifT//T不空{PostOrderTraverseT->lchild,Visit;//先后序遍历左子树PostOrderTraverseT->rchild,Visit;//再后序遍历右子树VisitT->data;//最后访问根结点}}voidmain{BiTreeT;InitBiTreeT;//初始化二叉树Tprintf"按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1200300";CreateBiTreeT;//建立二叉树Tprintf"先序递归遍历二叉树:";PreOrderTraverseT,visit;//先序递归遍历二叉树Tprintf"中序递归遍历二叉树:";InOrderTraverseT,visit;//中序递归遍历二叉树Tprintf"后序递归遍历二叉树:";PostOrderTraverseT,visit;//后序递归遍历二叉树T。
    米增春2019-12-21 18:58:17
  • #include"stdio.h"#include"stdlib.h"#defineSTACK_INIT_SIZE10//栈的初始长度#defineSTACKINCREMENT5//栈的追加长度typedefstructbitree{chardata;structbitree*lchild,*rchild;}bitree;//二叉树结点定义typedefstruct{bitree**base;bitree**top;intstacksize;}sqstack;//链栈结点定义top栈顶base栈底且栈元素是指向二叉树结点的二级指针//建立一个空栈intinitstacksqstack*s{s->base=bitree*mallocSTACK_INIT_SIZE*sizeofbitree;//栈底指向开辟空间if!s->baseexit1;//抛出异常s->top=s->base;//栈顶=栈尾表示栈空s->stacksize=STACK_INIT_SIZE;//栈长度为开辟空间大小return1;}//进栈intpushsqstack*s,bitree*e{ifs->top-s->base>=s->stacksize//如果栈满追加开辟空间{s->base=bitree*reallocs->base,s->stacksize+STACKINCREMENT*sizeofbitree;if!s->baseexit1;//抛出异常s->top=s->base+s->stacksize;//感觉这一句没用s->stacksize+=STACKINCREMENT;}*s->top=e;s->top++;//进栈栈顶后移return1;}//出栈intpopsqstack*s,bitree**e{ifs->top==s->basereturn0;//栈空返回0--s->top;*e=*s->top;//栈顶前移取出栈顶元素给ereturn1;}//取栈顶intgettopsqstack*s,bitree**e//去栈顶元素注意top指向的是栈顶的后一个{ifs->top==s->basereturn0;//所以s->top-1*e=*s->top-1;return1;}/*------------------------非递归-----先序建立二叉树----------------------------------*/bitree*createprebitree{charch;bitree*ht,*p,*q;sqstack*s;s=mallocsizeofbitree;//加上这一句为s初始化开辟空间ch=getchar;ifch!=''#''&&ch!=''''/*输入二叉树先序顺序是以完全二叉树的先序顺序不是完全二叉树的把没有的结点以#表示*/{ht=bitree*mallocsizeofbitree;ht->data=ch;ht->lchild=ht->rchild=NULL;p=ht;initstacks;pushs,ht;//根节点进栈whilech=getchar!=''''//算{ifch!=''#''{q=bitree*mallocsizeofbitree;//法q->data=ch;//ifp==*s->top-1p->lchild=q;//核elsep->rchild=q;//pushs,q;p=q;//心}//else{ifp==*s->top-1p->lchild=NULL;//的elsep->rchild=NULL;//pops,&p;}//步//}//骤returnht;}elsereturnNULL;}/*--------------------------递归---------先序建立二叉树-------------------------------*/voidCreateBiTreebitree**T{//按先序次序输入二叉树中的结点的值,空格字符表示空树,//构造二叉链表表示二叉树charch;scanf"%c",&ch;ifch==''#''*T=NULL;else{*T=bitree*mallocsizeofbitree;if!*Texit1;*T->data=ch;//生成根结点CreateBiTree&*T->lchild;//构造左子树CreateBiTree&*T->rchild;//构造右子树}}/*--------------------------非递归-------中序建立二叉树-------------------------------*//*--------------------------递归---------中序建立二叉树-------------------------------*//*--------------------------非递归-------后序建立二叉树-------------------------------*//*--------------------------递归---------后序建立二叉树-------------------------------*//*-----------------------非递归------先序输出二叉树------------------------------*/voidpreordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;printf"%c",h->data;h=h->lchild;}else{pop&m,&h;h=h->rchild;}}}/*------------------------非递归-----中序输出二叉树----------------------------*/voidinordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;h=h->lchild;}else{pop&m,&h;printf"%c",h->data;h=h->rchild;}}}/*---------------------非递归----后序遍历二叉树----------------------------------*/voidpostordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;h=h->lchild;}else{bitree*r;//使用r结点表示访问了右子树代替标志域gettop&m,&h;ifh->rchild&&h->rchild!=r{h=h->rchild;push&m,h;h=h->lchild;}else{pop&m,&h;printf"%c",h->data;r=h;h=NULL;}}}}//层次遍历二叉树用队列哈哈以后做/*-------------------------------主过程-------------------------------*/intmain{bitree*ht;printf"先序非递归建立一个二叉树:";ifht=createprebitree!=NULL//非递归建立//CreateBiTree&ht;//ifht!=NULL//递归建立{printf"先序遍历输出二叉树:";preordertraverseht;putchar'''';printf"中序遍历输出二叉树:";inordertraverseht;putchar'''';printf"后序遍历输出二叉树:";postordertraverseht;putchar'''';}elseprintf"空二叉树";}这是先序递归和非递归建立二叉树和先、中、后的遍历输出。
    黄益琴2019-12-21 18:42:19

相关问答

,int&count{//递归方法,ifT{if!T->lchild&&!T->rchildcount++;CountLeafT->lchild,count;//统计左子树中叶子结点个数CountLeafT->rchild,count;//统计右子树中叶子结点个数}}----------非递归,就是采用前序/中序/后序遍历所有节点,并统计。下面就给你提供分别用三个函数的统计方法PS:因为计数器定义为全局,所以三个函数不能同时使用,使用其中一个就能统计你要的节点数。include"stdlib.h"#defineMAXNODE20#defineISIZE8#defineNSIZE07#defineNSIZE18#defineNSIZE215//SHOWCHAR=1显示字符SHOWCHAR=0显示数字#defineSHOWCHAR1//二叉树结构体structBTNode{intdata;BTNode*rchild;BTNode*lchild;};//非递归遍堆栈structABTStack{BTNode*ptree;ABTStack*link;};staticpCounter=0;//计数器,记录节点个数/*前序遍历函数pre_Order_Access参数描述:BTNode*head:根节点指针*/voidpre_Order_AccessBTNode*head{BTNode*pt;ABTStack*ps,*top;pt=head;top=NULL;printf"\n二叉树的前序遍历结果:\t";whilept!=NULL||top!=NULL/*未遍历完,或堆栈非空*/{whilept!=NULL{ifSHOWCHARprintf"%c",pt->data;/*访问根节点*/elseprintf"%d",pt->data;/*访问根节点*/ps=ABTStack*mallocsizeofABTStack;/*根节点进栈*/ps->ptree=pt;ps->link=top;top=ps;pt=pt->lchild;/*遍历节点右子树,经过的节点依次进栈*/pCounter++;}iftop!=NULL{pt=top->ptree;/*栈顶节点出栈*/ps=top;top=top->link;freeps;/*释放栈顶节点空间*/pt=pt->rchild;/*遍历节点右子树*/}}}/*中序遍历函数mid_Order_Access参数描述:BTNode*head:根节点指针*/voidmid_Order_AccessBTNode*head{BTNode*pt;ABTStack*ps,*top;intcounter=1;pt=head;top=NULL;printf"\n二叉树的中序遍历结果:\t";whilept!=NULL||top!=NULL/*未遍历完,或堆栈非空*/{whilept!=NULL{ps=ABTStack*mallocsizeofABTStack;/*根节点进栈*/ps->ptree=pt;ps->link=top;top=ps;pt=pt->lchild;/*遍历节点右子树,经过的节点依次进栈*/pCounter++;}iftop!=NULL{pt=top->ptree;/*栈顶节点出栈*/ps=top;top=top->link;freeps;/*释放栈顶节点空间*/ifSHOWCHARprintf"%c",pt->data;/*访问根节点*/elseprintf"%d",pt->data;/*访问根节点*/pt=pt->rchild;/*遍历节点右子树*/}}}/*后序遍历函数last_Order_Access参数描述:BTNode*head:根节点指针*/voidlast_Order_AccessBTNode*head{BTNode*pt;ABTStack*ps,*top;intcounter=1;pt=head;top=NULL;printf"\n二叉树的后序遍历结果:\t";whilept!=NULL||top!=NULL/*未遍历完,或堆栈非空*/{whilept!=NULL{ps=ABTStack*mallocsizeofABTStack;/*根节点进栈*/ps->ptree=pt;ps->link=top;top=ps;pt=pt->lchild;/*遍历节点右子树,经过的节点依次进栈*/pCounter++;}iftop!=NULL{pt=top->ptree;/*栈顶节点出栈*/ps=top;top=top->link;freeps;/*释放栈顶节点空间*/printf"%c",pt->data;/*访问根节点*/pt=pt->rchild;/*遍历节点右子树*/}}。
#include"stdio.h"#include"stdlib.h"#defineSTACK_INIT_SIZE10//栈的初始长度#defineSTACKINCREMENT5//栈的追加长度typedefstructbitree{chardata;structbitree*lchild,*rchild;}bitree;//二叉树结点定义typedefstruct{bitree**base;bitree**top;intstacksize;}sqstack;//链栈结点定义top栈顶base栈底且栈元素是指向二叉树结点的二级指针//建立一个空栈intinitstacksqstack*s{s->base=bitree*mallocSTACK_INIT_SIZE*sizeofbitree;//栈底指向开辟空间if!s->baseexit1;//抛出异常s->top=s->base;//栈顶=栈尾表示栈空s->stacksize=STACK_INIT_SIZE;//栈长度为开辟空间大小return1;}//进栈intpushsqstack*s,bitree*e{ifs->top-s->base>=s->stacksize//如果栈满追加开辟空间{s->base=bitree*reallocs->base,s->stacksize+STACKINCREMENT*sizeofbitree;if!s->baseexit1;//抛出异常s->top=s->base+s->stacksize;//感觉这一句没用s->stacksize+=STACKINCREMENT;}*s->top=e;s->top++;//进栈栈顶后移return1;}//出栈intpopsqstack*s,bitree**e{ifs->top==s->basereturn0;//栈空返回0--s->top;*e=*s->top;//栈顶前移取出栈顶元素给ereturn1;}//取栈顶intgettopsqstack*s,bitree**e//去栈顶元素注意top指向的是栈顶的后一个{ifs->top==s->basereturn0;//所以s->top-1*e=*s->top-1;return1;}/*------------------------非递归-----先序建立二叉树----------------------------------*/bitree*createprebitree{charch;bitree*ht,*p,*q;sqstack*s;s=mallocsizeofbitree;//加上这一句为s初始化开辟空间ch=getchar;ifch!=''#''&&ch!=''\n''/*输入二叉树先序顺序是以完全二叉树的先序顺序不是完全二叉树的把没有的结点以#表示*/{ht=bitree*mallocsizeofbitree;ht->data=ch;ht->lchild=ht->rchild=NULL;p=ht;initstacks;pushs,ht;//根节点进栈whilech=getchar!=''\n''//算{ifch!=''#''{q=bitree*mallocsizeofbitree;//法q->data=ch;//ifp==*s->top-1p->lchild=q;//核elsep->rchild=q;//pushs,q;p=q;//心}//else{ifp==*s->top-1p->lchild=NULL;//的elsep->rchild=NULL;//pops,&p;}//步//}//骤returnht;}elsereturnNULL;}/*--------------------------递归---------先序建立二叉树-------------------------------*/voidCreateBiTreebitree**T{//按先序次序输入二叉树中的结点的值,空格字符表示空树,//构造二叉链表表示二叉树charch;scanf"%c",&ch;ifch==''#''*T=NULL;else{*T=bitree*mallocsizeofbitree;if!*Texit1;*T->data=ch;//生成根结点CreateBiTree&*T->lchild;//构造左子树CreateBiTree&*T->rchild;//构造右子树}}/*--------------------------非递归-------中序建立二叉树-------------------------------*//*--------------------------递归---------中序建立二叉树-------------------------------*//*--------------------------非递归-------后序建立二叉树-------------------------------*//*--------------------------递归---------后序建立二叉树-------------------------------*//*-----------------------非递归------先序输出二叉树------------------------------*/voidpreordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;printf"%c",h->data;h=h->lchild;}else{pop&m,&h;h=h->rchild;}}}/*------------------------非递归-----中序输出二叉树----------------------------*/voidinordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;h=h->lchild;}else{pop&m,&h;printf"%c",h->data;h=h->rchild;}}}/*---------------------非递归----后序遍历二叉树----------------------------------*/voidpostordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;h=h->lchild;}else{bitree*r;//使用r结点表示访问了右子树代替标志域gettop&m,&h;ifh->rchild&&h->rchild!=r{h=h->rchild;push&m,h;h=h->lchild;}else{pop&m,&h;printf"%c",h->data;r=h;h=NULL;}}}}//层次遍历二叉树用队列哈哈以后做/*-------------------------------主过程-------------------------------*/intmain{bitree*ht;printf"先序非递归建立一个二叉树:";ifht=createprebitree!=NULL//非递归建立//CreateBiTree&ht;//ifht!=NULL//递归建立{printf"先序遍历输出二叉树:";preordertraverseht;putchar''\n'';printf"中序遍历输出二叉树:";inordertraverseht;putchar''\n'';printf"后序遍历输出二叉树:";postordertraverseht;putchar''\n'';}elseprintf"空二叉树\n";}这是先序递归和非递归建立二叉树和先、中、后的遍历输出。
#include"stdio.h"#include"stdlib.h"#defineSTACK_INIT_SIZE10//栈的初始长度#defineSTACKINCREMENT5//栈的追加长度typedefstructbitree{chardata;structbitree*lchild,*rchild;}bitree;//二叉树结点定义typedefstruct{bitree**base;bitree**top;intstacksize;}sqstack;//链栈结点定义top栈顶base栈底且栈元素是指向二叉树结点的二级指针//建立一个空栈intinitstacksqstack*s{s->base=bitree*mallocSTACK_INIT_SIZE*sizeofbitree;//栈底指向开辟空间if!s->baseexit1;//抛出异常s->top=s->base;//栈顶=栈尾表示栈空s->stacksize=STACK_INIT_SIZE;//栈长度为开辟空间大小return1;}//进栈intpushsqstack*s,bitree*e{ifs->top-s->base>=s->stacksize//如果栈满追加开辟空间{s->base=bitree*reallocs->base,s->stacksize+STACKINCREMENT*sizeofbitree;if!s->baseexit1;//抛出异常s->top=s->base+s->stacksize;//感觉这一句没用s->stacksize+=STACKINCREMENT;}*s->top=e;s->top++;//进栈栈顶后移return1;}//出栈intpopsqstack*s,bitree**e{ifs->top==s->basereturn0;//栈空返回0--s->top;*e=*s->top;//栈顶前移取出栈顶元素给ereturn1;}//取栈顶intgettopsqstack*s,bitree**e//去栈顶元素注意top指向的是栈顶的后一个{ifs->top==s->basereturn0;//所以s->top-1*e=*s->top-1;return1;}/*------------------------非递归-----先序建立二叉树----------------------------------*/bitree*createprebitree{charch;bitree*ht,*p,*q;sqstack*s;s=mallocsizeofbitree;//加上这一句为s初始化开辟空间ch=getchar;ifch!=''#''&&ch!=''\n''/*输入二叉树先序顺序是以完全二叉树的先序顺序不是完全二叉树的把没有的结点以#表示*/{ht=bitree*mallocsizeofbitree;ht->data=ch;ht->lchild=ht->rchild=NULL;p=ht;initstacks;pushs,ht;//根节点进栈whilech=getchar!=''\n''//算{ifch!=''#''{q=bitree*mallocsizeofbitree;//法q->data=ch;//ifp==*s->top-1p->lchild=q;//核elsep->rchild=q;//pushs,q;p=q;//心}//else{ifp==*s->top-1p->lchild=NULL;//的elsep->rchild=NULL;//pops,&p;}//步//}//骤returnht;}elsereturnNULL;}/*--------------------------递归---------先序建立二叉树-------------------------------*/voidCreateBiTreebitree**T{//按先序次序输入二叉树中的结点的值,空格字符表示空树,//构造二叉链表表示二叉树charch;scanf"%c",&ch;ifch==''#''*T=NULL;else{*T=bitree*mallocsizeofbitree;if!*Texit1;*T->data=ch;//生成根结点CreateBiTree&*T->lchild;//构造左子树CreateBiTree&*T->rchild;//构造右子树}}/*--------------------------非递归-------中序建立二叉树-------------------------------*//*--------------------------递归---------中序建立二叉树-------------------------------*//*--------------------------非递归-------后序建立二叉树-------------------------------*//*--------------------------递归---------后序建立二叉树-------------------------------*//*-----------------------非递归------先序输出二叉树------------------------------*/voidpreordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;printf"%c",h->data;h=h->lchild;}else{pop&m,&h;h=h->rchild;}}}/*------------------------非递归-----中序输出二叉树----------------------------*/voidinordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;h=h->lchild;}else{pop&m,&h;printf"%c",h->data;h=h->rchild;}}}/*---------------------非递归----后序遍历二叉树----------------------------------*/voidpostordertraversebitree*h{sqstackm;initstack&m;whileh||m.base!=m.top{ifh{push&m,h;h=h->lchild;}else{bitree*r;//使用r结点表示访问了右子树代替标志域gettop&m,&h;ifh->rchild&&h->rchild!=r{h=h->rchild;push&m,h;h=h->lchild;}else{pop&m,&h;printf"%c",h->data;r=h;h=NULL;}}}}//层次遍历二叉树用队列哈哈以后做/*-------------------------------主过程-------------------------------*/intmain{bitree*ht;printf"先序非递归建立一个二叉树:";ifht=createprebitree!=NULL//非递归建立//CreateBiTree&ht;//ifht!=NULL//递归建立{printf"先序遍历输出二叉树:";preordertraverseht;putchar''\n'';printf"中序遍历输出二叉树:";inordertraverseht;putchar''\n'';printf"后序遍历输出二叉树:";postordertraverseht;putchar''\n'';}elseprintf"空二叉树\n";}这是先序递归和非递归建立二叉树和先、中、后的遍历输出。
文件main.cpp代码如下:#include//malloc等#include//标准输入输出头文件,包括EOF=^Z或F6,NULL等#include//atoi,exit#include//数学函数头文件,包括floor,ceil,abs等#defineClearBiTreeDestroyBiTree//清空二叉树和销毁二叉树的操作一样typedefstructBiTNode{intdata;//结点的值BiTNode*lchild,*rchild;//左右孩子指针}BiTNode,*BiTree;intNil=0;//设整型以0为空voidvisitinte{printf"%d",e;//以整型格式输出}voidInitBiTreeBiTree&T{//操作结果:构造空二叉树TT=NULL;}voidCreateBiTreeBiTree&T{//算法6.4:按先序次序输入二叉树中结点的值可为字符型或整型,在主程中定义,//构造二叉链表表示的二叉树T。变量Nil表示空子树。修改intnumber;scanf"%d",&number;//输入结点的值ifnumber==Nil//结点的值为空T=NULL;else//结点的值不为空{T=BiTreemallocsizeofBiTNode;//生成根结点if!TexitOVERFLOW;T->data=number;//将值赋给T所指结点CreateBiTreeT->lchild;//递归构造左子树CreateBiTreeT->rchild;//递归构造右子树}}voidDestroyBiTreeBiTree&T{//初始条件:二叉树T存在。操作结果:销毁二叉树TifT//非空树{DestroyBiTreeT->lchild;//递归销毁左子树,如无左子树,则不执行任何操作DestroyBiTreeT->rchild;//递归销毁右子树,如无右子树,则不执行任何操作freeT;//释放根结点T=NULL;//空指针赋0}}voidPreOrderTraverseBiTreeT,void*Visitint{//初始条件:二叉树T存在,Visit是对结点操作的应用函数。修改算法6.1//操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次ifT//T不空{VisitT->data;//先访问根结点PreOrderTraverseT->lchild,Visit;//再先序遍历左子树PreOrderTraverseT->rchild,Visit;//最后先序遍历右子树}}voidInOrderTraverseBiTreeT,void*Visitint{//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次ifT{InOrderTraverseT->lchild,Visit;//先中序遍历左子树VisitT->data;//再访问根结点InOrderTraverseT->rchild,Visit;//最后中序遍历右子树}}voidPostOrderTraverseBiTreeT,void*Visitint{//初始条件:二叉树T存在,Visit是对结点操作的应用函数//操作结果:后序递归遍历T,对每个结点调用函数Visit一次且仅一次ifT//T不空{PostOrderTraverseT->lchild,Visit;//先后序遍历左子树PostOrderTraverseT->rchild,Visit;//再后序遍历右子树VisitT->data;//最后访问根结点}}voidmain{BiTreeT;InitBiTreeT;//初始化二叉树Tprintf"按先序次序输入二叉树中结点的值,输入0表示节点为空,输入范例:1200300\n";CreateBiTreeT;//建立二叉树Tprintf"先序递归遍历二叉树:\n";PreOrderTraverseT,visit;//先序递归遍历二叉树Tprintf"\n中序递归遍历二叉树:\n";InOrderTraverseT,visit;//中序递归遍历二叉树Tprintf"\n后序递归遍历二叉树:\n";PostOrderTraverseT,visit;//后序递归遍历二叉树T。