C++数据结构笔记(11)二叉树的#号创建法及计算叶子节点数

news2024/9/30 3:21:12

首先分享一段计算叶子节点数目的代码,如下图:

不难发现,上面的二叉树叶子节点数目为4。我们可以采用递归的方式,每当一个结点既没有左结点又没有右节点时,即可算为一个叶子结点。

int num=0;
//全局变量,代表叶子节点数
void CaculateLeafNum(BinaryNode* root)
{
	if(root==NULL)
		return;
	if(root->lchild==NULL&&root->rchild==NULL)
		num++;
	//递归计算两个子树的叶子节点
	CaculateLeafNum(root->lchild);
	CaculateLeafNum(root->rchild);
	
	return;
} 

 如上时单独的方法名,在文末的全段代码中加入即可计算,输出的 num即为叶子结点数。

众所周知,根据某一顺序单一的遍历结果,并不能唯一地确定一颗二叉树,而通过中序和先序,或者中序和后序,即可以确定唯一的一颗二叉树,但是先序和后序不能   !这是因为,通过先序或者后序,可以判断出根结点,再根据中序区分左右子树——而先序+后序就不能判断出来。

也就是说,如果已知根结点的左右子树结点数目,那么只需要知道根结点,即可判断出唯一的二叉树。这里给出一种崭新的方式,当遍历位置上的结点为空时,我们可以人为地加入结点“#”来代替空结点,这样当我们得到一种无论什么方式的遍历,都可以得出唯一地二叉树!

BinaryNode* CreateBinaryTree(){
	fflush(stdin);
	//清除缓存区的函数 
	char ch;
	//标准输入 
	scanf("%c",&ch);
	
	BinaryNode* node;
	
	if(ch=='#')
		node=NULL;
		//用#号标识空结点 
	else{
		node=(BinaryNode*)malloc(sizeof(BinaryNode));
		//开辟内存区 
		node->ch=ch;
		//为当前结点赋值 
		node->lchild=CreateBinaryTree();
		//先递归创建左子树 
		node->rchild=CreateBinaryTree();
		//再递归创建右子树 
	}
	return node;
} 

上述代码为#号法创建二叉树的具体实现。

如下是完整代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
 
typedef struct BinaryNode{
	char ch;
	struct BinaryNode* lchild;
	struct BinaryNode* rchild;
}BinaryNode;

BinaryNode* CreateBinaryTree(){
	fflush(stdin);
	//清除缓存区的函数 
	char ch;
	//标准输入 
	scanf("%c",&ch);
	
	BinaryNode* node;
	
	if(ch=='#')
		node=NULL;
		//用#号标识空结点 
	else{
		node=(BinaryNode*)malloc(sizeof(BinaryNode));
		//开辟内存区 
		node->ch=ch;
		//为当前结点赋值 
		node->lchild=CreateBinaryTree();
		//先递归创建左子树 
		node->rchild=CreateBinaryTree();
		//再递归创建右子树 
	}
	return node;
} 
void RecursionMiddle(BinaryNode* root)
{
	if(root==NULL)
		return;
	RecursionMiddle(root->lchild);
	cout<<(root->ch)<<" "; 
	RecursionMiddle(root->rchild);
	//中序遍历的顺序为:左-根-右 	
}




int main(int argc, char** argv) {
	
	BinaryNode* root=CreateBinaryTree();
	RecursionMiddle(root);
	//主函数负责调用 
	
	return 0;
}

先给一个简单的例子,如下是一个二叉树:

在录入结点时,先读入根结点1,然后是1的左节点2,然后是2的左节点3,由于3是叶子节点,则其左结点为#,然后是右节点,此处也为#;然后向上回溯,轮到2的右节点,此处为4,然后又轮到4的左右结点,均为#;然后是根结点1的右节点,为5,然后是5的左右结点,均为#,所以输入应该为:

1 2 3 # # 4 # # 5 # #

输入满足所有结点均有#号子节点时自动跳出递归,根据中序遍历的规则,上述的输出结果应该为:

3 2 4 1 5

如上是运行结果,与预期保持一致!


下图是一张对博主有深刻意义的二叉树图,因为这是一段藏头诗。为了防止大家在读入的时候出错,博主在此处给出读入顺序的答案:

 6 1 3 7 # # 7 # 7 # 1 # # 1 6 # # 1 3 # 9 # #

 运行代码并输入上述解码藏头诗的密钥,即可得出最浪漫的情话,这里就先保留悬念咯~

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/804061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux--多个源文件编译成同一个可执行文件

写法一&#xff1a;不推荐 写法二、推荐 $&#xff1a;代表目标文件 $^&#xff1a;代表生成目标文件的所有源文件

收藏这11个插画网站,插画师必备!

无论是在哪种设计工作中&#xff0c;插画素材都是比较常用的素材。今天本文整理了11个好用的插画工具&#xff0c;能帮助设计师轻松绘制出插画&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一款国产的&#xff0c;省心省力的插画工具。它为设计师提供了简单易…

【Git】Git的概念安装工作区-暂存区-版本库

文章目录 Git概念-版本控制器Git安装Centos平台&ubuntu Git基本操作创建Git本地仓库配置Git 认识⼯作区、暂存区、版本库添加文件查看.git文件总结添加文件场景2 Git概念-版本控制器 引入 我们在编写各种⽂档时&#xff0c;为了防⽌⽂档丢失&#xff0c;更改失误&#xff0…

Nexperia和KYOCERA AVX Components Salzburg 就车规氮化镓功率模块达成合作

Nexperia和KYOCERA AVX Components Salzburg 就车规氮化镓功率模块达成合作 基础半导体器件领域的高产能生产专家Nexperia&#xff08;安世半导体&#xff09;近日宣布与国际著名的为汽车行业提供先进电子器件的供应商 KYOCERA AVX Components (Salzburg) GmbH 建立合作关系&am…

【弹力设计篇】聊聊隔离设计

为什么需要隔离设计 隔离其实就是Bulkheads&#xff0c;隔板。在生活中隔板的应用主要在船舱中进行设计&#xff0c;目的是为了避免因一处漏水导致整个船都沉下去。可以将故障减少在一定的范围内&#xff0c;而不是整个船体。 从架构演变来说的话&#xff0c;大多数系统都是从…

兵兵数码:网络机顶盒哪个好?2023最新网络机顶盒排名

网络机顶盒让电视机重生&#xff0c;解决卡顿、资源少、广告多等问题&#xff0c;我们每年都会进行网络机顶盒测评&#xff0c;今年已经测评过17款&#xff0c;通过多角度对比筛选了五款表现最佳的产品整理成网络机顶盒排名&#xff0c;近期想买网络机顶盒不知道网络机顶盒哪个…

工具篇-Mysql 性能优化

文章目录 前言一、Mysql 性能问题&#xff1a;1.1 一条sql 的执行流程&#xff1a;1.2 MySQL 可能出现的性能问题&#xff1a; 二、优化&#xff1a;2.1 硬件层面&#xff1a;2.2 软件层面&#xff1a;2.2 .1 mysql 参数配置优化&#xff1a;2.2.1.1 mysql 服务端连接优化&…

【Golang】Golang进阶系列教程--为什么 Go 语言 struct 要使用 tags

文章目录 前言struct tags 的使用使用反引号避免使用空格避免重复使用标准化的 tag 名称多个 tag 值 struct tags 的原理struct tags 的优势常用的 struct tags参考文章&#xff1a; 前言 在 Go 语言中&#xff0c;struct 是一种常见的数据类型&#xff0c;它可以用来表示复杂…

【MMdetection3d】Step1:环境搭建

Step1:环境搭建 1.创建并激活虚拟环境1.1 用官方Pytorch指令安装&#xff01;1.2 用官方mmcv指令安装&#xff01; 2 安装MMDetection3 克隆编译mmdetection3d4 环境测试5 测试demo 在Conda虚拟环境中搭建MMdetection3d环境 1.创建并激活虚拟环境 conda create -n mm3d python…

JavaEE简单示例——在使用Tomcat的时候可能出现的一些报错

简单介绍&#xff1a; 在我们之前使用Tomcat的时候&#xff0c;经常会出现在启动的时候因为一些报错导致项目无法正常的启动&#xff0c;我们就对一些比较常见的报错来看一下可能导致的原因&#xff0c;以及出现报错之后如何去解决。 严重: Failed to initialize end point a…

Spring中最简单的过滤器和监听器

1. 过滤器概念引入 Filter也称之为过滤器&#xff0c;它是Servlet技术中最实用的技术&#xff0c;Web开发人员通过Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截&#xff0c;从而实现一些特殊的功…

一文看完智能视频监控系统的工作原理及场景应用

智能视频监控系统的原理是利用摄像机采集视频信号&#xff0c;并通过相关的AI模型算法实时分析视频内容&#xff0c;提取出有用信息&#xff0c;如人脸、车牌号码、移动物体等&#xff0c;并进行识别及特征提取&#xff0c;最终形成监控报警、实时监控、历史录像回放等应用。 智…

【JAVA】 String 类简述笔记

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️初识JAVA】 文章目录 前言String类创建一个String类 常用方法字符串长度 length() 方法连接字符串 concat() 方法创建格式化字符串 format()功能 前言 string是C、java、VB等编程语言中的字符串&…

项目报错clone2.weekday is not a fuction

ant-design-vue中的dayjs版本和我项目中的dayjs版本不一样 项目中的dayjs版本号 ant-design-vue中的dayjs版本号"dayjs": “^1.11.9” 解决方法&#xff1a; 将项目中的版本号更新"dayjs": “^1.11.9” yarn add dayjs^1.11.9

lc162.寻找峰值

由于题目假设nums[-1]和nums[n]等于负无穷 如果nums[i]>nums[i1]&#xff0c;即nums[-1]<nums[i]>nums[i1]&#xff0c;那么在[0,i]区间内一定存在峰值 如果nums[i]<nums[i1]&#xff0c;即nums[i]<nums[i1]>nums[n]&#xff0c;那么在[i1,n-1]区间内一定存…

dubbo原理框架设计

dubbo原理框架设计 &#xff08;1&#xff09;config 配置层&#xff1a;对外配置接口&#xff0c;以 ServiceConfig, ReferenceConfig 为中心&#xff0c;可以直接初始化配置类&#xff0c;也可以通过 spring 解析配置生成配置类。 &#xff08;2&#xff09;proxy 服务代理…

如何使用postman判断返回结果是否正确

针对一个接口&#xff0c;我们在知道参数以及参数对应的结果时&#xff0c;可以通过postman进行判断&#xff0c;验证返回数据是否与预期数据相等。这样可以使我们的接口测试更加的方便简洁。 1、准备数据。 postman可以接受的文件格式如图所示&#xff0c;一般来说可以将我们…

mysql(五)主从配置

目录 前言 一、MySQL Replication概述 二、MySQL复制类型 三、部署MySQL主从异步复制 总结 前言 为了实现MySQL的读写分离&#xff0c;可以使用MySQL官方提供的工具和技术&#xff0c;如MySQL Replication&#xff08;复制&#xff09;、MySQL Group Replication&#xff08;组…

【读点论文】PP-YOLOE: An evolved version of YOLO,面向友好部署的模型设计,为项目后续产业落地提供了更加有效的参考

PP-YOLOE: An evolved version of YOLO Abstract 在本报告中&#xff0c;我们介绍了PP-YOLOE&#xff0c;一种具有高性能和友好部署的工业最先进的目标探测器。我们在之前的PP-YOLOv2的基础上进行优化&#xff0c;采用无锚模式&#xff0c;更强大的骨干和颈部配备CSPRepResSt…

【C语言数据结构】模拟·顺序表·总项目实现

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …