1、三、数据结构和算法设计用一个字符型保存节点数据,分别定义两个BiTree.h 中实现相关的功能。3.1 二叉链表的设计1.typedefstruct BiNode 2.chardata;3.structBiNode* lchild;/左孩子4.BiNode* rchild;右孩子5.BiTree;struct BiNode 类型的指针来指向左孩子和右孩子。在3.2 队列的实现typedef structElemType* data;int head; /队头指针int tail;队尾指针 SqQueue;队列主要用于二叉树遍历过程中的层序遍历,从根节点开始分别将左右孩子放入队列,然后从对头开始
2、输出。队列的相关操作封装在 SqQueue.h 中,包括入队、出队、判断队列是否为空等操作。四、全局函数的设计本程序中应用了一些全局函数,本着用到那个函数就把哪个函数设为全局函数的原则,抽象 出了以下全局函数:4.1 全局函数列表(1)BiTree* createBinaryTree(BiTree* b)本函数用于建立二叉树(2)void Traverse(BiTree* b)本函数用于遍历二叉树(3)void PreOrderTraverse(BiTree* b)本函数用于前序遍历二叉树(4)void InOrderTraverse(BiTree* b)本函数用于中序遍历二叉树(5)void
3、 PostOrderTraverse(BiTree* b)本函数用于后序遍历二叉树(6)void LevelOrderTraverse(BiTree* b)本函数用于层序遍历二叉树(7)void getLeavesNum(BiTree* b)本函数用于统计叶子结点个数(8)int getHeight(BiTree* b)本函数用于求二叉树的深度(9)void swap(BiTree* b)本函数用子树交换(10)void displayMenu()本函数用于展示菜单4.2 全局函数在具体系统中的分布BiTree.h此文件为二叉树的头文件,包含上述所有全局函数五、功能实现二叉树的基本操作这个程序
4、的主要功能就是建立二叉树, 然后运用先序、 中序等遍历方法遍历二叉树, 然后还有统计二叉树的叶子结点个数、求二叉树的深度以及进行子树的交换。5.1 二叉树的基本操作流程图如下菜单界面如下:5.2 二叉树的基本操作的代码如下5.2.1二叉树的建立1./ 按照前序输入二叉树结点的值, “ #”表示空2.BiTree* createBinaryTree(BiTree* b) 3.char ch; / 定义变量用于储存输入的字符scanf( %c , &ch);if (ch = # ) 6.b = NULL;7.8.else 9.if (b = (BiTree*)malloc( sizeof (BiT
5、ree) != NULL) / 如果内存分配成功就执行下面操作10./ 生成根节点11.b-data = ch;12./ 构造左子树13.lchild=createBinaryTree(b-lchild);14./ 构造右子树15.rchild=createBinaryTree(b-rchild);16.17.18.return b;19.5.2.2二叉树的遍历如图所示选择遍历后有三种方案可供选择:1) 前序遍历void PreOrderTraverse(BiTree* b) if (b = NULL) return ;/ 首先打印结点数据printf( %c , b-data);/ 再先序遍
6、历左子树PreOrderTraverse(b-/ 最后先序遍历右子树52) 中序遍历/ 中序遍历void InOrderTraverse(BiTree* b) / 首先中序遍历左子树InOrderTraverse(b-/ 再打印结点数据/ 最后中序遍历右子树3) 后序遍历/ 后序遍历void PostOrderTraverse(BiTree* b) / 首先后序遍历左子树PostOrderTraverse(b-/ 再后序遍历右子树/ 最后打印结点数据4) 层序遍历1./ 层序遍历2.void LevelOrderTraverse(BiTree* b) 3.SqQueue* s = initSq
7、Queue();4.BiTree* temp;5.if (b) 6.append(s, *b);7.while (!isEmpty(s) 5.2.3统计叶子结点个数/ 统计叶子节点intcount; / 全局变量,如果出现叶子结点就加一voidgetLeavesNum(BiTree* b) if (b) if (!lchild & !rchild) count+;getLeavesNum(b-5.3.4求二叉树的深度1./ 求二叉树的深度2.int getHeight(BiTree* b) 3.int leftHeight, rightHeight;4.if (!b) 5.return 0;6
8、.7.leftHeight = getHeight(b-8.rightHeight = getHeight(b-9.return leftHeight rightHeight ? leftHeight + 1 : rightHeight + 1;10.5.2.5子树交换1. / 子树交换BiTree* temp; / 临时变量,用于交换void swap(BiTree* b) temp = b-lchild;lchild = b-rchild;rchild = temp;swap(b-部分运行结果截图如下:建立二叉树:统计叶子节点个数:求二叉树的深度:六、参考文献1.Stephen Prata. C Primer Plus ( 第 6 版 ) 中文版 . 人民邮电出版社 . 2016 年2.CSDN 博客: 3.谭浩强 .C 程序设计(第四版) 清华大学出版社 .4. 严蔚敏数据结构c 语言版 第二版 人民邮电出版社
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1