数据结构 【实验7 二叉树基本操作】
实验7 二叉树基本操作
实验目的
1. 熟悉二叉树结点的结构和对二叉树的基本操作。
2. 掌握对二叉树每一种操作的具体实现。
3. 学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。
实验内容
该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。
/* 定义DataType为char类型 */
typedef char DataType;
/* 二叉树的结点类型 */
typedef struct BitNode
{DataType data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
/* 初始化二叉树,即把树根指针置空 */
void BinTreeInit(BitTree *BT)
/* 按先序次序建立一个二叉树*/
void BinTreeCreat(BitTree *BT)
/* 检查二叉树是否为空 */
int BinTreeEmpty(BitTree *BT)
/* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
void BinTraverse(BitTree *BT)
/* 求二叉树的深度 */
int BinTreeDepth(BitTree BT)
/* 求二叉树中所有结点数 */
int BinTreeCount(BitTree BT)
/* 清除二叉树,使之变为空树 */
void BinTreeClear(BitTree *BT)
1 #include <iostream> 2 #include <stdio.h> 3 #include <queue> 4 using namespace std; 5 6 /* 实验内容 7 该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。 8 */ 9 10 /* 定义DataType为char类型 */ 11 typedef char DataType; 12 13 /* 二叉树的结点类型 */ 14 typedef struct BitNode{ 15 DataType data; 16 struct BitNode *lchild,*rchild; 17 }BitNode,*BitTree; 18 19 /* 初始化二叉树,即把树根指针置空 */ 20 void BinTreeInit(BitTree &BT) 21 { 22 BT = NULL; 23 } 24 25 /* 按先序次序建立一个二叉树*/ 26 void BinTreeCreat(BitTree &BT) 27 { 28 //printf("请输入该节点的元素值:"); 29 scanf("%c",&BT->data); 30 while(BT->data==' ' || BT->data=='\n'){ 31 scanf("%c",&BT->data); 32 } 33 if(BT->data=='#'){ //输入为'#'说明该节点为空,返回上一步 34 BT=NULL; 35 return ; 36 } 37 BT->lchild = (BitNode*)malloc(sizeof(BitNode)); 38 BT->rchild = (BitNode*)malloc(sizeof(BitNode)); 39 printf("请输入%c的左节点\n",BT->data); 40 BinTreeCreat(BT->lchild); 41 printf("请输入%c的右节点\n",BT->data); 42 //printf("进入右子树\n"); 43 BinTreeCreat(BT->rchild); 44 } 45 46 /* 检查二叉树是否为空 */ 47 int BinTreeEmpty(BitTree BT) 48 { 49 if(BT==NULL) 50 return 1; 51 else 52 return 0; 53 } 54 55 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */ 56 void BinTraverse1(BitTree BT) //按前序遍历 57 { 58 if(BT==NULL) //递归出口 59 return ; 60 printf("%c",BT->data); 61 BinTraverse1(BT->lchild); 62 BinTraverse1(BT->rchild); 63 } 64 65 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */ 66 void BinTraverse2(BitTree BT) //按中序遍历 67 { 68 if(BT==NULL) //递归出口 69 return ; 70 BinTraverse2(BT->lchild); 71 printf("%c",BT->data); 72 BinTraverse2(BT->rchild); 73 } 74 75 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */ 76 void BinTraverse3(BitTree BT) //按后序遍历 77 { 78 if(BT==NULL) //递归出口 79 return ; 80 BinTraverse3(BT->lchild); 81 BinTraverse3(BT->rchild); 82 printf("%c",BT->data); 83 } 84 85 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */ 86 void BinTraverse4(BitTree BT) //按层次遍历 87 { 88 queue <BitTree> q; 89 BitTree cur = BT; 90 q.push(cur); 91 while(!q.empty()){ //队列空为止 92 cur = q.front(); 93 q.pop(); 94 if(cur==NULL) //遇到空节点退出本次循环 95 continue; 96 printf("%c",cur->data); //输出当前节点元素 97 q.push(cur->lchild); //将该节点的两个孩子节点入栈 98 q.push(cur->rchild); 99 } 100 } 101 102 /* 求二叉树的深度 */ 103 int BinTreeDepth(BitTree BT) 104 { 105 if(BT==NULL) //递归出口 106 return 0; 107 //记录左子树深度和右子树深度,返回较大的深度+1 108 int ldp = BinTreeDepth(BT->lchild); 109 int rdp = BinTreeDepth(BT->rchild); 110 return ldp>rdp?ldp+1:rdp+1; 111 } 112 113 /* 求二叉树中所有结点数 */ 114 int BinTreeCount(BitTree BT) 115 { 116 if(BT==NULL) //递归出口 117 return 0; 118 //返回左子树节点数和右子树节点数再加上当前节点 119 return BinTreeCount(BT->lchild) + BinTreeCount(BT->rchild) + 1; 120 } 121 122 /* 清除二叉树,使之变为空树 */ 123 void BinTreeClear(BitTree &BT) 124 { 125 if(BT==NULL) //递归出口 126 return ; 127 //左右子树找到底,然后返回的时候依次销毁空间 128 BinTreeClear(BT->lchild); 129 BinTreeClear(BT->rchild); 130 free(BT); 131 BT=NULL; 132 } 133 134 int Menu() //菜单 135 { 136 int n; 137 printf("[1] 按先序次序建立一个二叉树\n"); 138 printf("[2] 检查二叉树是否为空\n"); 139 printf("[3] 按先序输出二叉树中的所有结点\n"); 140 printf("[4] 按中序输出二叉树中的所有结点\n"); 141 printf("[5] 按后序输出二叉树中的所有结点\n"); 142 printf("[6] 按层次输出二叉树中的所有结点\n"); 143 printf("[7] 求二叉树的深度\n"); 144 printf("[8] 求二叉树中所有结点数\n"); 145 printf("[9] 清除二叉树,使之变为空树\n"); 146 printf("[0] 退出\n"); 147 scanf("%d",&n); 148 return n; 149 } 150 151 void Reply(BitTree &BT,int n) //对菜单的响应 152 { 153 switch(n){ 154 case 1: //创建二叉树 155 if(BT!=NULL) 156 printf("已创建二叉树! 请先清除二叉树再创建!\n"); 157 else{ //二叉树为空 158 printf("按先序依次增加节点,输入'#'表示空节点!\n\n"); 159 BT = (BitNode*)malloc(sizeof(BitNode)); //创建根节点 160 BT->lchild = NULL; 161 BT->rchild = NULL; 162 printf("请输入根节点的元素值:\n"); 163 BinTreeCreat(BT); 164 printf("\n二叉树创建成功!\n\n"); 165 } 166 break; 167 case 2: //检查二叉树是否为空 168 if(BinTreeEmpty(BT)) 169 printf("二叉树为空!\n\n"); 170 else 171 printf("二叉树不为空!\n\n"); 172 break; 173 case 3: //按前序遍历 174 if(BT==NULL){ 175 printf("二叉树为空!无法遍历!\n\n"); 176 break; 177 } 178 printf("前序遍历顺序为:\n"); 179 BinTraverse1(BT); 180 printf("\n\n"); 181 break; 182 case 4: //按中序遍历 183 if(BT==NULL){ 184 printf("二叉树为空!无法遍历!\n\n"); 185 break; 186 } 187 printf("中序遍历顺序为:\n"); 188 BinTraverse2(BT); 189 printf("\n\n"); 190 break; 191 case 5: //按后序遍历 192 if(BT==NULL){ 193 printf("二叉树为空!无法遍历!\n\n"); 194 break; 195 } 196 printf("后序遍历顺序为:\n"); 197 BinTraverse3(BT); 198 printf("\n\n"); 199 break; 200 case 6: //按层次遍历 201 if(BT==NULL){ 202 printf("二叉树为空!无法遍历!\n\n"); 203 break; 204 } 205 printf("层次遍历顺序为:\n"); 206 BinTraverse4(BT); 207 printf("\n\n"); 208 break; 209 case 7: //求二叉树的深度 210 printf("二叉树的深度为:%d\n\n",BinTreeDepth(BT)); 211 break; 212 case 8: //求二叉树的节点数 213 printf("二叉树的总结点数为:%d\n\n",BinTreeCount(BT)); 214 break; 215 case 9: //清除二叉树 216 if(BT==NULL){ 217 printf("二叉树已经为空!无需清空!\n\n"); 218 break; 219 } 220 BinTreeClear(BT); 221 printf("清除成功!\n\n"); 222 break; 223 default: 224 exit(1); 225 } 226 system("pause"); 227 system("cls"); 228 } 229 230 int main() 231 { 232 BitTree BT = NULL; 233 BinTreeInit(BT); //初始化二叉树 234 while(1){ 235 int n = Menu(); 236 Reply(BT,n); 237 } 238 return 0; 239 }
Freecode : www.cnblogs.com/yym2013
转载于:https://www.cnblogs.com/yym2013/p/3791088.html
数据结构 【实验7 二叉树基本操作】相关推荐
- 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验
实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...
- c语言数据结构二叉树实验报告,数据结构实验三二叉树实验报告.doc
数据结构实验三二叉树实验报告 数据结构实验报告 实验名称: 实验三--二叉树 学生姓名: XX 班 级: 班内序号: 学 号: 日 期: 1.实验要求 1.1实验目的 通过选择下面两个题目之一进行实现 ...
- sdut 3341数据结构实验之二叉树二:遍历二叉树
数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536K Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如 ...
- 数据结构实验之二叉树五:层序遍历 // oj3344 队列+二叉树 // 先序 --层次
原题链接:oj3344 数据结构实验之二叉树五:层序遍历 Description 已知一个按先序输入的字符序列,如abd,eg,cf,(其中,表示空结点).请建立二叉树并求二叉树的层次遍历序列. In ...
- 数据结构实验二 :二叉树的操作与实现
数据结构实验一:线性表,堆栈和队列实现 数据结构实验二 :二叉树的操作与实现 数据结构实验三: 图的操作与实现 数据结构实验四 : 查找和排序算法实现 文章目录 一.实验目的: 二.使用仪器.器材 三 ...
- 3344 数据结构实验之二叉树五:层序遍历
数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 已知一个按先序输入的字符序列,如abd,,e ...
- 数据结构实验报告-二叉树的存储结构的实现与应用
实验目的 熟悉二叉树结点的结构和对二叉树的基本操作. 掌握对二叉树每一种操作的具体实现. 学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法. 在二叉树基本操作的基础上掌握二叉树的应用. 实验 ...
- 数据结构 实验7 二叉树的应用
实验7 二叉树的应用 (1)实验目的 通过该实验,使学生理解二叉树的链式存储,掌握二叉树的几种遍历算法,并通过该实验使学生理解递归的含义,掌握C语言编写递归函数的方法和注意事项. (2)实验内容 实现 ...
- 数据结构 实验六 图基本操作的编程实现
[实验目的] 图基本操作的编程实现 要求: 图基本操作的编程实现(2学时,验证型),掌握图的建立.遍历.插入.删除等基本操作的编程实现,存储结构可以在顺序结构.链接结构.联合使用多种结构等中任选,也可 ...
最新文章
- Linux 基础命令——比较两个文件内容的不同
- 设计模式总结 (4)结构型模式
- Maven项目SSM整合中mysql8.0.11对应Druid版本问题以及pom.xml写法
- 一键导出Origin图片MATLAB代码
- [Cocoa]深入浅出 Cocoa 之 Core Data(2)- 手动编写代码
- java 对象的态_Java面向对象-------多态总结
- monkey自动化测试移动app 操作指南——真机 安卓(Android)app测试
- 理论基础 —— 查找
- LeNet-5——CNN经典网络模型详解(pytorch实现)
- Larry Ellison - 简介
- linux内核文件恢复,linux下系统文件恢复
- C#写字板问题一二 —— C#+WinForm编程趣味入门实战-天轰穿.NET4趣味编程视频教程...
- 股市日记之十四:牛二阶段(上篇)
- 通过crond定时任务自动更新动态IP到PubYun(3322)实现远程访问
- Mac修改登陆界面背景图片,开机登陆界面,替换沙漠背景图 @macOS Mojave - 10.14.x
- 云计算中的laaS、PaaS和SaaS是什么意思?
- 计算机网络图标在哪里照,网络设备图标-电脑上的网络图标怎么显示
- 插入新题注变乱了_关于Word题注的问题,这篇文章能解决99%!
- 让你的网页自动显示电话来电号码并录音---免费下载来电显示ActiveX控件(OCX)
- 协程的概念,为什么要用协程,以及协程的使用