1、InitStack&S 操作结果:构造一个空栈StackEmpty( S )初始条件:栈S已存在。假设S为空栈,那么返回OK,否那么返回ERROR。 Push( &S, e )初始条件: 操作结果:插入元素e为新的栈顶元素。 Pop( &S, &e )初始条件:栈S已存在且非空。删除S的栈顶元素,并用e返回其值。GetTop( S, &用e返回S的栈顶元素。2.二叉树的抽象数据类型ADT BinaryTree 数据对象D:D是具有一样特性的数据元素的集合。 数据关系R: 假设D=,那么R=,称BinaryTree为空二叉树; 假设D,那么R=H,H是如下二元关系; 1在D中存在惟一的称为根的数
2、据元素root,它在关系H下无前驱; 2假设D-root,那么存在D-root=D1,Dr,且D1Dr =; 3假设D1,那么D1中存在惟一的元素x1,H,且存在D1上的关系H1 H;假设Dr,那么Dr中存在惟一的元素xr,H,且存在上的关系Hr H;H=,data=ch; if (CreateBiTree(T-lchild) T-LTag=Link;rchild) T-RTag=Link; return OK;b)先序递归遍历二叉数T,并输出全部结点值。void PreOrderTraverse_re(BiTree T,int (*print)(TElemType e) if(T) if(p
3、rint(T-data) PreOrderTraverse_re(T-lchild,print); PreOrderTraverse_re(T-rchild,print); return ;c)中序非递归遍历二叉树T,并输出全部结点值void InOrderTraverse(BiTree T,int (*print)(TElemType e) SqStack S; S.base=NULL;S.top=NULL; SElemType p=NULL; InitStack(S); Push(S,T); while(!StackEmpty(S) while(GetTop(S,p)&p) Push(S,
4、p-lchild); Pop(S,p); Pop(S,p); print(p-data);rchild); return;d)中序递归遍历二叉树T,并输出全部结点值void InOrderTraverse_re(BiTree T,int (*print)(TElemType e) if(T) InOrderTraverse_re(T- print(T- e)中序遍历二叉树T,并将其中序线索化,Thrt指向头结点 void InOrderThreading(BiThrTree &Thrt,BiThrTree T) Thrt=(BiThrTree)malloc(sizeof(BiThrNode);
5、 Thrt-/建头结点RTag=Thread;rchild=Thrt;/右指针回指 if(!lchild=Thrt; Thrt-lchild=T; pre=Thrt; InThreading(T);/中序遍历进展中序线索化 pre-/最后一个结点线索化rchild=pre; i=Thrt;/InOrderThreadingf)结点p线索化void InThreading(BiThrTree p) if (p) InThreading(p- / 左子树线索化 if (!p-lchild) / 建前驱线索 p-LTag = Thread; p-lchild = pre;pre-rchild) /
6、建后继线索 pre-RTag = Thread; pre-rchild = p; pre = p; / 保持pre指向p的前驱 / 右子树线索化 / InThreadingg)/中序遍历线索化二叉树int InOrderTraverse_Thr(BiThrTree T, int (*print)(TElemType e) BiThrTree p=NULL; p=T-lchild; while(p!=T) while(p-LTag=Link) p=p-print(p-RTag=Thread &rchild!rchild; p=p-4.栈typedef struct SElemType *base
7、; SElemType *top; int stacksize;SqStack;a)创立一个空栈S) S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType); S.top=S.base; /初始为空 S.stacksize=STACK_INIT_SIZE;b)栈顶插入元素e) if(S.top-S.base=S.stacksize) S.base=(SElemType*)realloc(S.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SElemType); S.top=S.base+S
8、.stacksize; S.stacksize+=STACKINCREMENT; *S.top+=e;c)栈顶删除元素 if(S.top=S.base) return; e=*-S.top;d)判断栈是否为空栈int StackEmpty(SqStack S) return OK; return ERROR;e)e返回S的栈顶元素 e=*(S.top-1);5.主函数int flag; BiTree T; BiThrTree Thrt; printf(*n);* 实验12 二叉树的遍历 *n* 1. 实现二叉树的不同遍历算法和二叉树的中序线索化算法 *n* a) 中序递归遍历算法; *n* b
9、) 先序递归遍历算法;* c) 中序遍历的非递归算法;* d) 先序或后序遍历非递归算法之一;* e) 建立中序线利用线索进展中序遍历和反中序遍历。* 2. 实现二叉树的按层遍历算法。*nn选择操作:nt1.先序与中序遍历算法nt2.中序线索的中序遍历和反中序遍历算法nt3.按层遍历算法n请选择:%dflag); switch(flag) case 1: printf(前序递归创立二叉树空格 表示此结点为空:n getchar(); CreateBiTree(T);中序递归遍历输出: InOrderTraverse_re(T,print);n前序递归遍历输出: PreOrderTraverse
10、_re(T,print);n中序非递归遍历输出: InOrderTraverse(T,print);n前序非递归遍历输出: PreOrderTraverse(T,print); break; case 2:n中序遍历线索化二叉树: InOrderThreading(Thrt , T); InOrderTraverse_Thr(Thrt , print); case 3:n按层遍历输出: Levelorder(T); default:return; 6.函数间调用关系mainInOrderTraverse_reCreateBitreePreOrderTraverse_reInOrderTrave
11、rsePreOrderTraverseInOrderThreadingInOrderTraverse_ThrThreadingStack操作调试分析1、二叉树的分层遍历,开场时想用队列来做,但考虑到比拟麻烦,因而改为数组模拟队列,简单易懂,课后可自行尝试用队列来做。2 在线索化二叉树时考虑到如果将两种存储构造分开将导致两个类型的指针不能互相传值,造成许多麻烦。比拟两种存储构造发现,线索二叉树比二叉树多了两个标志域LTag,Rtag。于是把两种存储构造合并为BiThrNode,并在建立二叉树时把LTag,Rtag均置为Link。程序正常运行。 3.进入演示程序BiTree.cpp,完成编译,连接
12、即按下Ctrl F5进入演示界面,或直接翻开执行文件BiTree.exe,产生如下列图所示的界面:1用户需根据用户提示信息操作,输入二叉树以空格表示空结点,输入完成后按回车键,屏幕上打印出对应于该二叉树的各种遍历结果。如下列图:六、测试结果输入:屏幕输出:中序递归遍历输出:a+b*c-d前序递归遍历输出:+a*b-cd中序非递归遍历输出:前序非递归遍历输出:按层遍历输出:中序遍历线索化二叉树:七、附录BiTree.cppBiTree.exe#includestdlib.h#define QElemType BiTNodetypedef enum PointerTagLink,Thread; /Link=0,指针,Thread=1,线索 /二叉树 SElemType *base; SElemType *top; int stacksize;/全局变量/*函数声明*/ /*二叉树的创立递归创立*/(T=(BiTNode *)mal
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1