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

news/2025/1/15 10:52:33/

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

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

相关文章

2.7. Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?

Java 泛型&#xff08;generics&#xff09;是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制&#xff0c;该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型&#xff0c;也就是说所操作的数据类型被指定为一个参数。 Java 的泛型是伪泛型&am…

mac下安装vue cli脚手架并搭建一个简易项目

目录 1、确定本电脑下node和npm版本是否为项目所需版本。 2、下载vue脚手架 3、创建项目 1、下载node。 如果有node&#xff0c;打开终端&#xff0c;输入node -v和npm -v , 确保node和npm的版本&#xff0c;(这里可以根据自己的需求去选择&#xff0c;如果对最新版本的内容有…

android Glide加载gif动图和本地视频,Java

droid Glide加载gif动图和本地视频&#xff0c;Java //从手机存储本地加载视频 String filePath "/storage/emulated/0/Pictures/my_video.mp4"; Glide .with( context ).load( Uri.fromFile( new File( filePath ) ) ).into( imageView );//加载gif Glide .with(…

Drupal教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Drupal是使用PHP语言编写的开源内容管理框架&#xff08;CMF&#xff09;&#xff0c;它由内容管理系统&#xff08;CMS&#xff09;和PHP开发框架&#xff08;Framework&#xff09;共同构成&#xff0c;在GPL2.0及更新协议下发布。连续多年荣获全球最佳CMS大奖&…

【Git】初始化仓库配置与本地仓库提交流程

目录 一、仓库配置邮箱与用户名 二、本地仓库提交流程 一、仓库配置邮箱与用户名 【Git】Linux服务器Centos环境下安装Git与创建本地仓库_centos git仓库搭建_1373i的博客-CSDN博客https://blog.csdn.net/qq_61903414/article/details/131260033?spm1001.2014.3001.5501 在…

【算法与数据结构】110、LeetCode平衡二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;二叉树遍历一共有前中后遍历和层序遍历&#xff0c;这道题只有后序遍历适合&#xff0c;求深度是从上往…

应用层协议——http

文章目录 1. HTTP协议1.1 认识URL1.2 urlencode和urldecode1.3 HTTP协议格式1.3.1 HTTP请求1.3.2 HTTP响应1.3.3 外网测试1.3.4 添加html文件1.3.5 HTTP常见Header1.3.6 GET和POST 1.4 HTTP的状态码1.4.1 301和3021.4.2 代码实现 1.5 Cookie1.5.1 代码验证1.5.2 Cookiesession …

使用多数据源dynamic-datasource-spring-boot-starter遇到的问题记录

记录使用多数据源dynamic-datasource-spring-boot-starter遇到的问题&#xff1a; 1、工程启动失败 缺少clickhouse连接驱动&#xff0c;引入对应的maven依赖 <!--ck连接驱动--><dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>…