二叉树的遍历和统计二叉树中度为0、度为1、度为2的结点个数

2023-10-27

实验五 树的应用–二叉树的遍历

一、实验目的:
1、了解二叉树的逻辑结构和物理结构;

逻辑结构:1对多的关系,层次关系明显
物理结构:在内存的存储结构,常用的有二叉链表和三叉链表

2、掌握二叉树数据类型定义;
3、熟练掌握二叉树在链式存储结构上的遍历操作;

深度遍历:先序遍历、中序遍历、后序遍历
*广度遍历:层次遍历

二、实验要求:

基本要求:编程实现二叉树的先序、中序、后序遍历方式(递归方式);
*编程实现二叉树的层次遍历方式(递归或非递归方式);
*统计二叉树中各种结点的个数;

三、实验任务:

1.从终端输入二叉树元素序列,
2.建立对应的二叉树;
3.采用递归的方式先序遍历并输出遍历序列
4.中序遍历并输出遍历序列
5.后序遍历二叉树并输出遍历序列;
6.*采用递归或非递归的方式层次遍历二叉树;*采用递归的方式统计二叉树中度为0、度为1、度为2的结点个数;ps:下面我采用的是递归方式
7.采用递归方式销毁二叉树。

例如:建立如下图1所示的二叉树,则在终端输入“AB##DE##C##”序列,其中“#”表示空树。程序运行结果参考见图2。

图1 二叉树
在这里插入图片描述
图2 程序运行结果
在这里插入图片描述

四、代码如下
// 采用递归算法实现二叉树的三种深度遍历:先序遍历、中序遍历、后序遍历,并统计二叉树中各种结点的个数。

// 二叉树的存储结构采用的二叉链表
// 例如输入AB##DE##C##,则确定要建立的二叉树
// 采用递归方式先序、中序、后序遍历二叉树
// 采用后序方式销毁二叉树
// 统计二叉树中各种结点的个数

#include<iostream.h>
#include<stdlib.h>

#define OVERFLOW -1
#define OK 1
#define ERROR 0


typedef int status;
typedef char TElemType;

//二叉树的二叉链表存储结构

typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode, *BiTree;




//创建二叉树status CreatBiTree(BiTree &t) 

void CreateBiTree(BiTree &T){
   TElemType ch;
   cin>>ch;
   
   if(ch=='#'){
   T=NULL;
   }else{
   	T=new BiTNode;
   	T->data = ch;
   	CreateBiTree(T->lchild);
   	CreateBiTree(T->rchild);
   } 
}


//先序遍历二叉树void PreOrderTraverse(BiTree t)	

void PreOrderTraverse(BiTree T){
    if(T){
		cout<<T->data;
	PreOrderTraverse(T->lchild);

	PreOrderTraverse(T->rchild);
    }

}		


//中序遍历二叉树void InOrderTraverse(BiTree t)			
void InOrderTraverse(BiTree T){
if(T){
	InOrderTraverse(T->lchild);
	cout<<T->data;
	InOrderTraverse(T->rchild);
}

}

//后序遍历二叉树void PostOrderTraverse(BiTree t)			
void PostOrderTraverse(BiTree T){
if(T){
	PostOrderTraverse(T->lchild);
	
	PostOrderTraverse(T->rchild);
	cout<<T->data;
}

}

//后序销毁二叉树void DestroyBiTree(BiTree &t)

void  Destroy(BiTree &T){
	if(T){
	if(T->lchild!=NULL){
	Destroy(T->lchild);}
	if(T->rchild!=NULL){
	Destroy(T->rchild);}
	if(T!=NULL){
	free(T);}
	} 
}


//统计二叉树中度为0的结点的个数int Node0Count( BiTree t) 

int Node0Count(BiTree T) {
	if(T){
		//是叶子节点就返回1,不是就继续递归
     if(T->lchild==NULL&&T->rchild==NULL){
          return 1;
	 }else{
	 	  return Node0Count(T->lchild)+Node0Count(T->rchild);
	 }
	}else{
	return 0;
	}


}


//统计二叉树中度为1的结点的个数int Node1Count( BiTree t) 
int Node1Count(BiTree T) {
	if(T){
		
    if(T->lchild!=NULL&&T->rchild==NULL||T->lchild==NULL&&T->rchild!=NULL){ 
		//如果有一个结点,但是我们不能确定之后的节点出现在哪个子树上,所以还需要遍历子树
     	return Node1Count(T->lchild)+Node1Count(T->rchild)+1;
	}else{
    return	Node1Count(T->lchild)+Node1Count(T->rchild);
	}
	}
	return 0;
}


//统计二叉树中度为2的结点的个数int Node2Count( BiTree t) 
int Node2Count(BiTree T) {
	if(T){
	if(T->lchild!=NULL&&T->rchild!=NULL){
	//如果有两个结点,我们需要遍历左右两个子树
		return Node2Count(T->lchild)+Node2Count(T->rchild)+1;
	}else{
	return Node2Count(T->lchild)+Node2Count(T->rchild);
	}
	}
	return 0;
}


void main(){
	int ch;
	BiTree t=NULL;
	cout<<"命令菜单:\n\t1.建立二叉树\n\t2.先序遍历\n\t3.中序遍历\n\t4.后序遍历\n\t5.遍历二叉树所有节点\n\t6.销毁二叉树\n\t7.退出"<<endl;
	cout<<"\n请输入命令:";

	cin>>ch;	
	while(ch!=8){
		switch(ch){
			case 1:	cout<<"\n请输入要建立的二叉树中的元素,#代表空树\n";
					CreateBiTree(t);
					cout<<"二叉树建立成功\n";
					cout<<"\n请继续输入命令:";
					break;

			case 2:	cout<<"先序遍历的结果为:";
					PreOrderTraverse(t);
					cout<<"\n\n请继续输入命令:";
					break;

			case 3:	cout<<"中序遍历的结果为:";
					InOrderTraverse(t);
					cout<<"\n\n请继续输入命令:";
					break;

			case 4:	cout<<"后序遍历的结果为:";
					PostOrderTraverse(t);
					cout<<"\n\n请继续输入命令:";
					break;

			case 5: cout<<"二叉树中度为0的结点个数为:"<<Node0Count(t)<<endl;
					cout<<"二叉树中度为1的结点个数为:"<<Node1Count(t)<<endl;
					cout<<"二叉树中度为2的结点个数为:"<<Node2Count(t)<<endl;
					cout<<"\n\n请继续输入命令:";
					break;

			case 6:	Destroy(t);
					cout<<"二叉树已销毁.";
					cout<<"\n\n请继续输入命令:";
					break;
		
			default: cout<<"\n输入命令出错,请重新输入命令:";
		}

		cin>>ch;
	}
}//main
五、实验结果图

#####

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树的遍历和统计二叉树中度为0、度为1、度为2的结点个数 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • Lock锁和Condition条件

    Lock的特性 Lock不是Java语言内置的 synchronized是在JVM层面上实现的 如果代码执行出现异常 JVM会自动释放锁 但是Lock不行 要保证锁一定会被释放 就必须将unLock放到finally 中 手动释放 在资源竞
  • OSPF协议

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 HCIA第四天 前言 一 OSPF协议 二 LAS优化 特殊区域 1 解决OSPF的不规则区域 三 扩展配置 前言 一 OSPF协议 OSPF 开放式最短路径优先协议 无类别
  • spring boot 将对象转换为json返回

    Spring Boot默认使用Jackson将对象转换为json 需要配置以下依赖 compile group com fasterxml jackson core name jackson core version 2 9 4 compi
  • matlab实现kmeans聚类算法

    kmeans聚类算法是一种简单实用的聚类算法 matlab自带函数kmeans可直接对数据进行kmeans聚类 为了方便更好地掌握kmeans聚类算法 今天我们自己来实现一个弱化的版本mykmeans mykmeans输入包含三项 分别为聚
  • 【数据结构】图-图的遍历_广度优先遍历(动态图解、c++、java)

    文章目录 一 概述 二 广度优先搜索 图解 BFS树 代码 邻接矩阵实现 邻接表实现 链式前向星实现 三 完整代码 邻接矩阵版 邻接表版 链式前向星版 四 总结 算法复杂度分析 基于邻接矩阵的 BFS 算法 基于邻接表的 BFS 算法 注意
  • 【Mac】一些软件的图片和视频位置 QQ 微信

    1 QQ 在finder的菜单项中 前往 文件夹 输入 Library Containers com tencent qq Data Library Caches Videos QQ还是比较流氓的 其中光images下的文件就有5G 他会把
  • 【日常笔记】linux系统docker的操作安装启动卸载

    安装linux系统 阿里云镜像下载centos7 选择dvd iso镜像 找到 docker ce 也就是社区免费版本下载 以上都有官方文档说明 就不再写出来了 配置阿里云镜像加速器 全部安装完毕后找到阿里云 gt 容器镜像服务 gt 镜像
  • 使用nginx部署vue项目后,刷新会找不到页面解决解决方法

    当使用Nginx部署Vue项目时 刷新页面可能导致无法找到页面的问题 这是由于Vue Router使用了前端路由的方式导致的 要解决这个问题 你可以进行以下配置 1 在Nginx配置文件中添加一个位置 Location 块来处理所有的URL
  • STL-常用算法(二.拷贝 替换 算术 集合)

    开篇先附上STL 常用算法 一 的链接 STL 常用算法 一 遍历 查找 排序 小梁今天敲代码了吗的博客 CSDN博客 目录 常用拷贝和替换算法 copy函数示例 将v1容器中的元素复制给v2 replace函数示例 将容器中的20 替换成
  • [carla] carla-ros-bridge 修改信号灯行为。

    本教程适用于采用编译下载安装方式安装carla ros bridge 的用户 1 修改信号灯 1 1 修改原理 我们要通过API过滤出所有绿灯的actor信息 然后修改他们的状态为常绿 查阅API网站可知traffic light具有set
  • java获取两个字符串日期之间间隔的天数

    java获取两个字符串日期之间间隔的天数 import java text ParseException import java text SimpleDateFormat import java util ArrayList
  • spyder 如何执行需要命令行参数的脚本

    spyder 如何执行需要命令行参数的脚本 run CTA py splash image C Users XXX Desktop A3 jpg weights D KerasProject MaskRCNN mask rcnn ballo
  • Detectron2入门教程

    参考 Detectron2入门教程 云 社区 腾讯云 目录 1 概述 1 1 自己的源码阅读流程 1 2 目录结构 1 3 搭积木过程 1 4 官方文档阅读 2 数据处理 2 1 概述 2 2 基本流程 2 3 build detectio
  • CoordinatorLayout详解二:

    作为Material Design风格的重要组件 CoordinatorLayout协调多种组件的联动 实现各种复杂的效果 在实际项目中扮演着越来越重要的角色 本篇博客将由浅到深 带你一起玩转CoordinatorLayout 官方文档对C
  • SpringBoot通过HttpClient方式调用Restful接口

    前言 HttpClient相比于传统jdk自带的URLConnection 增加了易用性和灵活性 它不仅是客户端发送http请求变得容易 而且也方便了开发人员测试接口 提高了开发的效率 HttpClient是Apache Jakarta C
  • No Network Security Config specified, using platform default

    报错日志 No Network Security Config specified using platform default 在日志中看 这个并没有报红 但是网络请求不成功 确实是这个引起的 可笑的是 在模拟器上 虽然报了这个警告 但是
  • 免费图片在线压缩网站推荐

    第一种 https img top PNG压缩过后依旧透明太棒 亲测 几乎无损 完全免费界面清新简洁 优点 实用 支持 JPG PNG GIF 等格式无损压缩 缺点 5MB限制 超过5MB无法压缩 第二种 http www 660660 t
  • 启动物联网项目所需的一切:关于流处理

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 在本文中 我们将围绕物联网或流处理系统的一些技术问题建立完整的基础和多方面的理解 以便读者在规划物联网系统时能够做出明智的决策或是有根据地提出问题 我们的意图是为开始考虑流处理和物联
  • Panel三维数据结构丨Pandas数据分析基础(5)

    个人主页 互联网阿星 格言 选择有时候会大于努力 但你不努力就没得选 作者简介 大家好我是互联网阿星 和我一起合理使用Python 努力做时间的主人 如果觉得博主的文章还不错的话 请点赞 收藏 留言 支持一下博主哦 行业资料 PPT模板 简
  • 二叉树的遍历和统计二叉树中度为0、度为1、度为2的结点个数

    文章目录 实验五 树的应用 二叉树的遍历 一 实验目的 1 了解二叉树的逻辑结构和物理结构 2 掌握二叉树数据类型定义 3 熟练掌握二叉树在链式存储结构上的遍历操作 二 实验要求 三 实验任务 四 代码如下 五 实验结果图 实验五 树的应用