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

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

不难发现,上面的二叉树叶子节点数目为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.mzph.cn/news/11974.shtml

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

相关文章

MyBatis-入门-快速入门程序

本次使用MyBatis框架是基于SpringBoot框架进行的&#xff0c;在IDEA中创建一个SpringBBot工程&#xff0c;根据自己的需求选择对应的依赖即可 快速入门 需求&#xff1a;使用MyBatis查询所有用户数据步骤&#xff1a; 准备工作&#xff08;创建Spring Boot工程、数据库user表…

【误差自适应跟踪方法AUV】自适应跟踪(EAT)方法研究(Matlab代码Simulin实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、Simulink模型、文献 &#x1f4a5;1 概述 摘要&#xff1a;跟踪问题&#xff08;即如何遵循先前记忆的路径&#xff09;是移动机器人中最重要的问题之一。根据机器人状…

机器学习深度学习——线性回归的从零开始实现

虽然现在的深度学习框架几乎可以自动化实现下面的工作&#xff0c;但从零开始实现可以更了解工作原理&#xff0c;方便我们自定义模型、自定义层或自定义损失函数。 import random import torch from d2l import torch as d2l线性回归的从零开始实现 生成数据集读取数据集初始…

windows默认编码格式修改

1.命令提示符界面输入 chcp 936 对应 GBK 65001 对应 UTF-8 2.临时更改编码格式 chcp 936(或65001) 3.永久更改编码格式 依次开控制面板->时钟和区域->区域->管理->更改系统区域设置&#xff0c;然后按下图所示&#xff0c;勾选使用UTF-8语言支持。然后重启电脑。此…

防止连点..

1.连点js文件 let timer; letflag /*** 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次** param {Function} func 要执行的回调函数* param {Number} wait 延时的时间* param {Boolean} immediate 是否立即执行* return null*/ function throttle(func, wait 500…

【数字IC基础】竞争与冒险

竞争-冒险 1. 基本概念2. 冒险的分类3. 静态冒险产生的判断4. 毛刺的消除使用同步电路使用格雷码增加滤波电容增加冗余项&#xff0c;消除逻辑冒险引入选通脉冲 1. 基本概念 示例一&#xff1a; 如上图所示的这个电路&#xff0c;使用了两个逻辑门&#xff0c;一个非门和一个与…

Windows 找不到文件‘chrome‘。请确定文件名是否正确后,再试一次

爱像时间&#xff0c;永恒不变而又短暂&#xff1b;爱像流水&#xff0c;浩瀚壮阔却又普普通通。 Windows 找不到文件chrome。请确定文件名是否正确后&#xff0c;再试一次 如果 Windows 提示找不到文件 "chrome"&#xff0c;可能是由于以下几种原因导致的&#xff1…

机器学习深度学习——模型选择、欠拟合和过拟合

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——多层感知机的简洁实现 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有…

【GitOps系列】使用 ArgoCD 快速打造GitOps工作流

文章目录 ArgoCD简介ArgoCD安装访问ArgoCDGitOps 工作流总览创建 ArgoCD 应用检查 ArgoCD 同步状态访问应用 连接 GitOps 工作流体验 GitOps 工作流生产建议1&#xff09;修改默认密码2&#xff09;配置 Ingress 和 TLS3&#xff09;使用 Webhook 触发 ArgoCD4&#xff09;将源…

DoIP学习笔记系列:(二)VN5620 DoIP测试配置实践笔记

文章目录 1. 添加.cdd2. CAPL中调用接口发送DoIP请求3. “Ethernet Packet Builder”的妙用4. CANoe也可以做交互界面在进行测试前,先检查车载以太网硬件连线是否正确,需要注意连接两端的Master、Slave,100M、1000M等基本情况,在配置VN5620的时候就可以灵活处理了。成功安装…

数学建模-MATLAB三维作图

导出图片用无压缩tif会更清晰 帮助文档&#xff1a;doc 函数名 matlab代码导出为PDF 新建实时脚本或右键文件转换为实时脚本实时编辑器-全部运行-内嵌显示保存为PDF

【TypeScript】接口类型 Interfaces 的使用理解

导语&#xff1a; 什么是 类型接口&#xff1f; 在面向对象语言中&#xff0c;接口&#xff08;Interfaces&#xff09;是一个很重要的概念&#xff0c;它是对行为的抽象&#xff0c;而具体如何行动需要由类&#xff08;classes&#xff09;去实现&#xff08;implement&#x…

JVM-类加载

1.了解冯诺依曼计算机结构 1.1计算机处理数据过程 (1)提取阶段:由输入设备把原始数据或信息输入给计算机存储器存起来 (2)解码阶段:根据CPU的指令集架构(ISA)定义将数值解译为指令 (3)执行阶段:再由控制器把需要处理或计算的数据调入运算器 (4)最终阶段:由输出设备把最后运…

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归时间序列区间预测模型&#xff1…

Dooring-Saas低代码技术详解

hello, 大家好, 我是徐小夕, 今天和大家分享一下基于 H5-Dooring零代码 开发的全新零代码搭建平台 Dooring-Saas 的技术架构和设计实现思路. 背景介绍 3年前我上线了第一版自研零代码引擎 H5-Dooring, 至今已迭代了 300 多个版本, 主要目的是快速且批量化的生产业务/营销过程中…

empty module导致的lvs问题

write_verilog时-exclude empty_modules即可 这里也分享一下ICC2 write lvs netlist的命令 write_verilog -exclude {scalar_wire_declarations leaf_module_declarations empty_modules well_tap_cells filler_cells supply_statements} -hierarchy all -force_no_referenc…

手风琴案例(jQuery)

案例效果 代码实现 jQuery代码&#xff08;两种方法&#xff09; 方法一&#xff1a;hover版 $(function () {$(".king li").hover(function() {$(this).addClass("current").siblings().removeClass("current");}, function() {$(".king…

单机部署NGINX

​ 1、找到合适的nginx资源包&#xff0c;可以去官网下载 这里用的是 nginx-1.24.0.tar.gz 2、上传下载下来的nginx软件包&#xff0c;并解压 tar zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0/ 3、安装nginx 编译 ./configure --prefix/usr/local/nginx --with-http_ssl…

哈希表的简单模拟实现

文章目录 底层结构哈希冲突闭散列定义哈希节点定义哈希表**哈希表什么情况下进行扩容&#xff1f;如何扩容&#xff1f;**Insert()函数Find()函数二次探测HashFunc()仿函数Erase()函数全部的代码 开散列定义哈希节点定义哈希表Insert()函数Find()函数Erase()函数总代码 初识哈希…

UG\NX二次开发 获取2D制图视图中可见的对象,并获取类型

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 使用UF_VIEW_ask_visible_objects获取2D制图视图中可见的对象,并获取类型。 下面是将一个六面体以不同的视图投影,获取视图对象和类型的效果。 效果: 1个部件事例,1个体,4条边 1个部件事…