1、数据结构课程设计二叉树目 录一、问题描述 1二、测试数据 1三、算法思想 1四、模块划分 1五、数据结构 2六、源程序 2七、测试情况 7八、设计体会 8参 考 文 献 9一、问题描述(1)用二叉链表存储表示法,定义一颗排序二叉树;(2)输入树的各个结点,用先序遍历的的顺序建立二叉链表。按先序输入二叉树中结点的值,创建二叉链表表示的二叉树T;(3)对建立的排序二叉树进行层次、先序、中序和后序遍历并统计该二叉树中叶子结点的数目;(4)用菜单实现各部分的操作;二、测试数据建立二叉树:ABC#DE#G#F#三、算法思想在本课程设计中涉及的算法大部分用了递归的算法思想。递归即是 一个过程和函数在其自定
2、义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解四、模块划分(1)void PreOrderTraverse(BiTree T)、void PostOrderTraverse(BiTree T)、void InOrderTraverse(BiTree T),这几个函数分别为前序、后序、中序遍历二叉树,都用了递归的算法思想,对二叉树进行不同次序的遍历。前、中、后序分别按根-左-右、左-根-右、左-右-根的顺序遍历结点;(2)void CreateBiTree(BiTree &T),此函数功能是通过先序遍历的的顺序建立二叉树。按先
3、序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T;(3)void lev_traverse(BiTree T) ,此函数功能为按层遍历二叉树。其中借鉴了循环队列进队、出队的算法思想,通过不断地对二叉树节点进行进队出队,从上到下从左到右遍历了二叉树;(4)int leaf(BiTree T),此函数用递归方法求二叉树的叶子数. 当某节点无左子树和右子树时,二叉树的叶子数就等于没有子树的节点个数。五、数据结构用二叉树的二叉链表存储法表示二叉树Ttypedef struct BiNode char data; /结点数据域struct BiNode *lchild,*rchild;
4、 /左右孩子指针BiTNode,*BiTree;六、源程序#includeusing namespace std;#define MAXQSIZE 100#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;#define MAXSIZE 100typedef int Status;typedef struct BiNode /二叉树的二叉链表存储表示 char data; /结点数据域 struct BiNode *lchild,*rchild; /左右孩子指针BiTNode,*BiTree;typedef stru
5、ct BiTree *base; BiTree *top; int stacksize;SqStack;typedef struct BiTree *base;/初始化时动态分配存储空间 int front;/头指针 int rear;/尾指针SqQueue;Status InitQueue(SqQueue &Q) / 循环队列的初始化。构造一个空队列Q Q.base = new BiTreeMAXQSIZE; if(!Q.base) return OVERFLOW; / 存储分配失败 Q.front = 0; Q.rear = 0; return OK;int QueueLength(SqQ
6、ueue Q)/ 返回Q的元素个数,即队列的长度 return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;Status EnQueue(SqQueue &Q,BiTree e)/ 循环队列的入队,插入元素e为Q的新的队尾元素 if(Q.rear+1)%MAXQSIZE = Q.front) return ERROR;/尾指针在循环意义上加1后等于头指针,表明队满 Q.baseQ.rear = e; Q.rear = (Q.rear+1)%MAXQSIZE; return OK;Status DeQueue(SqQueue &Q,BiTree &e)/循环队列的出队
7、if(Q.rear = Q.front) return ERROR; e = Q.baseQ.front; Q.front = (Q.front+1)%MAXQSIZE; return OK;void CreateBiTree(BiTree &T) /先序遍历的的顺序建立二叉链表。按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T char ch; cin ch; if(ch=#) T=NULL; /递归结束,建空树 else T=new BiTNode; T-data=ch; /生成根结点 CreateBiTree(T-lchild); /递归创建左子树 CreateBi
8、Tree(T-rchild); /递归创建右子树 /else /CreateBiTreevoid PreOrderTraverse(BiTree T) /先序遍历二叉树T的递归算法 if(T) cout data; PreOrderTraverse(T-lchild); PreOrderTraverse(T-rchild); void PostOrderTraverse(BiTree T) /后序遍历二叉树T的递归算法 if(T) PostOrderTraverse(T-lchild); PostOrderTraverse(T-rchild); cout data; void InOrderT
9、raverse(BiTree T) /中序遍历的递归算法 if(T) InOrderTraverse(T-lchild); cout data; InOrderTraverse(T-rchild); void lev_traverse(BiTree T) /层序遍历SqQueue q;BiTree p;p=T;InitQueue(q);EnQueue(q,p);while(q.rear!=q.front) DeQueue(q,p); coutdata; if(p-lchild!=NULL) EnQueue(q,p-lchild); if(p-rchild!=NULL) EnQueue(q,p-
10、rchild);int leaf(BiTree T) /求二叉树的叶子数 if (T=NULL) return 0; else if (T-lchild=NULL&T-rchild=NULL) return 1; else return leaf(T-lchild)+leaf(T-rchild); void menu(void) /主菜单 system(cls); coutnn; coutttt 二叉树的简单应用n; coutttt*n; coutttt* *n; coutttt* 1 建 树 *n; coutttt* 2 层 次 遍 历 *n; coutttt* 3 先 序 遍 历 *n;
11、coutttt* 4 中 序 遍 历 *n; coutttt* 5 后 序 遍 历 *n; coutttt* 6 求 叶 子 数 *n; coutttt* 7 退 出 *n; coutttt* *n; coutttt*n; couti; switch(i) case 1: cout请输入建立二叉链表的序列:n; CreateBiTree(tree); coutendl; break; case 2: cout所建立的二叉链表先序序列:n; PreOrderTraverse(tree); coutendl; break; case 3: cout所建立的二叉链表中序序列:n; InOrderTr
12、averse(tree); coutendl; break; case 4: cout所建立的二叉链表层序遍历:n; lev_traverse(tree); coutendl; break; case 5: cout所建立的二叉链表后序序列:n; PostOrderTraverse(tree); coutendl; break; case 6: cout所建立的二叉链表的叶子数为:n; m=leaf(tree); coutm; coutendl; case 7: exit(0);break; default: cout输入错误,请输入(1-7):n;break; cout按回车键继续.n; g
13、etchar(); getchar(); 七、测试情况八、设计体会通过这次课程设计,我进一步地了解了二叉树的算法思想,熟悉了递归运算的方法,以及如何提高c+编程的性能等等,初步掌握了建立二叉树并进行二叉树基本运算的方法和技术,通过动手操作,使我对理论的学习掌握得更好。课程设计的过程,让我收获很多,从理论到实践,让我学到很多很多的东西,不仅可以巩固学过的知识,而且拓展了自己的知识面。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,但坚持下去不断努力,总能有所收获。参 考 文 献1 严蔚敏,李冬梅等.数据结构实验教程(C语言版).北京:人民邮电出版社,2010.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1