实验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 二叉树基本操作】相关推荐

  1. 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验

    实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...

  2. c语言数据结构二叉树实验报告,数据结构实验三二叉树实验报告.doc

    数据结构实验三二叉树实验报告 数据结构实验报告 实验名称: 实验三--二叉树 学生姓名: XX 班 级: 班内序号: 学 号: 日 期: 1.实验要求 1.1实验目的 通过选择下面两个题目之一进行实现 ...

  3. sdut 3341数据结构实验之二叉树二:遍历二叉树

    数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536K Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如 ...

  4. 数据结构实验之二叉树五:层序遍历 // oj3344 队列+二叉树 // 先序 --层次

    原题链接:oj3344 数据结构实验之二叉树五:层序遍历 Description 已知一个按先序输入的字符序列,如abd,eg,cf,(其中,表示空结点).请建立二叉树并求二叉树的层次遍历序列. In ...

  5. 数据结构实验二 :二叉树的操作与实现

    数据结构实验一:线性表,堆栈和队列实现 数据结构实验二 :二叉树的操作与实现 数据结构实验三: 图的操作与实现 数据结构实验四 : 查找和排序算法实现 文章目录 一.实验目的: 二.使用仪器.器材 三 ...

  6. 3344 数据结构实验之二叉树五:层序遍历

    数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 已知一个按先序输入的字符序列,如abd,,e ...

  7. 数据结构实验报告-二叉树的存储结构的实现与应用

    实验目的 熟悉二叉树结点的结构和对二叉树的基本操作. 掌握对二叉树每一种操作的具体实现. 学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法. 在二叉树基本操作的基础上掌握二叉树的应用. 实验 ...

  8. 数据结构 实验7 二叉树的应用

    实验7 二叉树的应用 (1)实验目的 通过该实验,使学生理解二叉树的链式存储,掌握二叉树的几种遍历算法,并通过该实验使学生理解递归的含义,掌握C语言编写递归函数的方法和注意事项. (2)实验内容 实现 ...

  9. 数据结构 实验六 图基本操作的编程实现

    [实验目的] 图基本操作的编程实现 要求: 图基本操作的编程实现(2学时,验证型),掌握图的建立.遍历.插入.删除等基本操作的编程实现,存储结构可以在顺序结构.链接结构.联合使用多种结构等中任选,也可 ...

最新文章

  1. Linux 基础命令——比较两个文件内容的不同
  2. 设计模式总结 (4)结构型模式
  3. Maven项目SSM整合中mysql8.0.11对应Druid版本问题以及pom.xml写法
  4. 一键导出Origin图片MATLAB代码
  5. [Cocoa]深入浅出 Cocoa 之 Core Data(2)- 手动编写代码
  6. java 对象的态_Java面向对象-------多态总结
  7. monkey自动化测试移动app 操作指南——真机 安卓(Android)app测试
  8. 理论基础 —— 查找
  9. LeNet-5——CNN经典网络模型详解(pytorch实现)
  10. Larry Ellison - 简介
  11. linux内核文件恢复,linux下系统文件恢复
  12. C#写字板问题一二 —— C#+WinForm编程趣味入门实战-天轰穿.NET4趣味编程视频教程...
  13. 股市日记之十四:牛二阶段(上篇)
  14. 通过crond定时任务自动更新动态IP到PubYun(3322)实现远程访问
  15. Mac修改登陆界面背景图片,开机登陆界面,替换沙漠背景图 @macOS Mojave - 10.14.x
  16. 云计算中的laaS、PaaS和SaaS是什么意思?
  17. 计算机网络图标在哪里照,网络设备图标-电脑上的网络图标怎么显示
  18. 插入新题注变乱了_关于Word题注的问题,这篇文章能解决99%!
  19. 让你的网页自动显示电话来电号码并录音---免费下载来电显示ActiveX控件(OCX)
  20. 协程的概念,为什么要用协程,以及协程的使用

热门文章

  1. 【ruoyi若依】flot 图表跑版
  2. 【MySQL】日期函数:仿trunc、当年、当月、当天
  3. 【ruoyi若依】启用HTTPS/SSL后,首页重定向出错
  4. MySQL复制数据库
  5. spring cloud bus AMQP学习笔记
  6. Vue.extend
  7. 在日常办公能做什么_日常生活中电烤箱能烤制什么美食呢?
  8. Flink 分别读取kafka和mysql作为source
  9. Apache Flink 零基础入门(十一)Flink transformation
  10. 一、自然语言处理概述