《二叉树排序算法》由会员分享,可在线阅读,更多相关《二叉树排序算法(15页珍藏版)》请在金锄头文库上搜索。
1、实验报告课程名称:数据构造实验课程实验四、串的基本操作练习一、实验目的1. 掌握二叉树的存储实现 .掌握二叉树的遍历思想掌握二叉树的常用算法的程序实现二、实验环境V+6.三、实验内容1.输入字符序列,建立二叉树的二叉链表构造。(可以采用先序序列) 2.实现二叉树的先序、中序、后序的递归遍历算法。 实现二叉树的先序、中序、后序的非递归遍历算法。 4求二叉树的高度。 .求二叉树的结点个数。 6.求二叉树的叶子结点的个数。四、实验规定: 分别编写实现上述算法的子函数,并编写一种主函数,在主函数中设计一种简朴的菜单,分别调用上述子函数。五、实验环节和成果1.打开vc,新建文本,命名二叉树算法,编写代码
2、。2编写代码:#cude #clude dfineSTA_II_SIZ 10efineSTAKINCRMNT 1int =0;*-建立堆栈-*ypefstruct BiTNod cha at; truc iTNo *lchld,*rchild; iNod,*BTree;/树类型yedef structqStak BiTNodbse; BiTNe *top; nt sacsze;SqStac;/栈类型voidIitac(qSck *S)/创立二叉树 S-ae(BiTNd*)mlloc(AC_NIT_IZE*seof(BiNod); S-topSase; S-staksze=STACKNIT_SI
3、ZE;voi Puh(SStack *,BiTNode )/进栈 if(Stop - bse =S-aize)/如果栈空间局限性 Sae=(BiNode*)reloc(S-base,(S-stacsize+STCKINCREME)szeof(BiTode)); S-top=-base+S-stackiz; S-akze+=SCINCRMENT; *(-o)=e; Stop+;iNe Pop(SqSack )/出栈 S-top -; rturn*S-p;int StckEmpty(SqStack*S)/判断栈与否非空 if(S-top= S-bae ) retrn 1; ele etrn 0;/
4、*-递归部分-*/iTree Crae(iTee T)/建立二叉树 char h; chtch(); i(h=#) =NULL; else if(!(T=(iTNoe *)mlloc(sizeof(BiNde))) prntf(申请内存空间失败!); -data=ch; T-chil=Cet(T-lchil); -rhildrat(-rchl); returnT;i Sueaf(Tree T)/计算叶子节点 nt m=,m,n; if(T) f((!T-lid)&(!-rchild)) sum+; m=umleaf(T-lchild); sum+m; =Sumaf(T-rchil); sum+
5、n; returnum;*int Suleaf(BTre T)/教师课堂上的计算叶子数的代码,没有问题if(!(T-lhl&T-rchild)return;lsereun(uma(li)Smleaf(Trchild));*int Prder1(BiTre T)/先序递归 i(T) rintf(%c,-d);/根节点+; POrdr1(T-lid); PrOrer_1(Tcld); return; void InOder_(BiTree T)/中序递归 if(T) InOrer_1(lchld); prnf(%c,T-data);/根节点 IO1(-rchid); voidotrder1(BiT
6、re T)/后序递归 if(T) PostOrde_1(-lcild); ostrer_1(T-rhld); printf(c,T-dta);/根节点 int Depth(BiTree T)/计算高度 int de=0,dpl,pr; if(!T)ep=0; else p=(-lcild); depr=Dept(T-cild); ep=1(deldep?dp:pr); retun dep; *-非递归部分-*/vo reder_(BTree T)/先序非递归 SqStack S; iTree pT,q;q=(BTNode*)mlloc(sizeof(BiTNode)); niac(S); i(
7、p) Push(&S,*p); while(!StackEmpty(S) p=q; *pPp(&S);/移到叶子时,出栈,输出出栈元素 pritf(c,p-da); f(p-rchild)/如果有右孩子,访问右孩子,并沿右孩子移位 Pu(&S,*p-cild); if(p-lcd)/如果没有右孩子,访问左孩子,并移到左孩子 Push(&,*p-child);vodnOde_2(iTee )/中序非递归 SqStakS; BiTreep,q;p=T; InitStack(S);q=(BiNod )malo(of(BiNode); whie(|!tackEmpt()) if() Push(S,p)
8、; =p-lcild; else =q; *p=Pop(&S); prin(%c,p-data); p=-rchi;vid PosOrer_2(BiTree T)/后序非递归 int mk100;/标示nt =0;ntop=-;下标SqacS; BiTrep=T,q; InitStck(&S);q(BiTNode *)lloc(szeo(BNode));if(&(plchil|-il)) d wh(p-cld|-rchid)&mrktop+1!=)/循环直到让向左滑到叶子节点 top+; Push(,*p);/每循环一次,目前结点入栈 rktop=1;/结点第一次入栈时,标志为1 i(lchid) p=p-hil;/找最左子树 elsef(-chi)p=-rcld; (p) ptf(c,-daa); p=; *p=Pp(S); t-;出栈,下标归位 if(!p-child|!p-lchild)/避免浮现不必要的再次入栈 mrktp+1=2; (arop+=1&chl)/若结点是第一次出栈,则再入栈 o+; u(S,p); rkto=2;/结点第二次入栈时,标志为2 p=-rhild;/访问右子树 arkop+1=; if(ma0=2&t=0)/当栈剩余最后一种结点的时候,把下标初始化。 int i; +; o(i=;10;i+) marki0;