数据结构——链式二叉树
目录
🍁一、二叉树的遍历
🌕(一)、前序遍历(Preorder Traversal 亦称先序遍历)
🌕(二)、中序遍历(Inorder Traversal)
🌕(三)、后序遍历(Postorder Traversal)
(四)、层序遍历
🍁二、学习链式二叉树的意义
🍁三、二叉树遍历的代码实现
🌕(一)、前序遍历的代码实现
🌕(二)、中序遍历的代码实现
🌕(三)、后序遍历的代码实现
🌕(四)、求节点个数
🌕(五)、求叶子节点的个数
🌕(六)、求第K层的节点个数
🍁一、二叉树的遍历
在此之前我们先了解一下二叉树的四种遍历方式。
二叉树遍历 (Traversal) 是按照某种特定的规则,依次对二叉 树中的节点进行相应的操作,并且每个节点只操作一次 。
🌕(一)、前序遍历(Preorder Traversal 亦称先序遍历)
即先访问根节点,再访问左子树,最后访问右子树,如下图:
🌕(二)、中序遍历(Inorder Traversal)
即先访问左子树,再访问根节点,最后访问右子树,如下图:
🌕(三)、后序遍历(Postorder Traversal)
即先访问左子树,再访问右子树,最后访问根节点,如下图:
(四)、层序遍历
即一层一层的访问完毕,如下图:
🍁二、学习链式二叉树的意义
(一)、首先我们学习这部分知识要知道的是:普通的二叉树是没有意义的,你说用来存储数据,我直接用顺序表和链表等等不是更方便吗?
(二)、我们在这里学习链式二叉树有两个意义:
①:为后续学习更复杂的二叉树搜索树(如AVL、红黑树)打基础;
②:很多OJ题就喜欢考这一块;
(三)、在这里增删查改不是重点,我们重点学习二叉树的结构(递归结构)
🍁三、二叉树遍历的代码实现
在实现遍历算法之前,为我们首先得有一棵二叉树,因为我们只需要测试某一个功能,所以不需要完整的二叉树结构,这时我们就可以手动的快速建立一个二叉树,如下:
#include<stdio.h> #include<stdlib.h>//二叉树结构体 typedef struct BinaryTreeNode {struct BinaryTreeNode* right;struct BinaryTreeNode* left;int val; }BTNode;//创建一个结点 BTNode* BuyNode(int x) {BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){printf("malloc fail");return;}node->val = x;node->right = NULL;node->left = NULL;return node; }int main() {//手动构建一颗二叉树//获得6个结点BTNode* node1 = BuyNode(1);BTNode* node2 = BuyNode(2);BTNode* node3 = BuyNode(3);BTNode* node4 = BuyNode(4);BTNode* node5 = BuyNode(5);BTNode* node6 = BuyNode(6);//手动连接一个二叉树node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return 0; }如上就是该二叉树的代码结构:
🌕(一)、前序遍历的代码实现
//前序遍历 void PrevOrder(BTNode* node1) {if (node1 == NULL)return;printf("%d ", node1->val);PrevOrder(node1->left);PrevOrder(node1->right); }上面就是前序遍历的代码部分,根据规则先访问根节点(即打印),再访问左子树,最后访问右子树(递归),代码部分很简洁,但最重要的是要理解其递归栈帧展开结构:
、
蓝色字体是该位置表示的结点;
红色箭头是代码走向;
红色带圈数字是代码执行顺序;
🌕(二)、中序遍历的代码实现
这三种遍历方法无非就是访问顺序不一样,所以只需要改变相应顺序即可:
//中序遍历 void InOrder(BTNode* node1) {if (node1 == NULL)return;PrevOrder(node1->left);printf("%d ", node1->val);PrevOrder(node1->right); }先访问左子树,再访问根节点(打印),最后访问右子树;
递归栈帧开辟与前序类似,可参考前序遍历自行思考;
🌕(三)、后序遍历的代码实现
//后序遍历 void EndOrder(BTNode* node1) {if (node1 == NULL)return;PrevOrder(node1->left);PrevOrder(node1->right);printf("%d ", node1->val); }
🌕(四)、求节点个数
//求结点个数 int TreeSixe(BTNode* root) {return (root == NULL) ? 0 : (TreeSixe(root->left) + TreeSixe(root->right)+1); }求一颗二叉树有多少个节点,我们很容易想到和遍历的思路有关,这样我们就可以写出上述代码:
具体我们可以结合递归栈帧展开图来读代码,由上述所示,我们先计算的是左子树的节点个数,再计算右子树的节点个数,最后再加上当前根节点数,然后返回值,所以这类似于一种后序遍历。
🌕(五)、求叶子节点的个数
//求叶子结点个数 int TreeLeafSize(BTNode* root) {//度为1的节点就可能访问到NULL,所以需要此判断if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return 1;return TreeLeafSize(root->left) + TreeLeafSize(root->right);}三种情况:
①:该节点为空,返回0;
②:该节点的左孩子和右孩子都为NULL,即该节点为叶子节点,此时返回1;
③:该节点即不为NULL,也不为叶子节点,即该节点为非叶子节点,此时将任务抛给它的左右子树(左右孩子),所以返回递归和。
注意:
这里有一点容易混淆,就是很多人觉得最多就到叶子节点,不会到空节点,所以第一个if是不是可以不要?答案肯定是要的,因为这种想法是忽略了度为1的非叶子节点的情况,这种节点只有一个孩子,所以当该孩子访问完后就会访问另一个孩子,即访问到NULL;
🌕(六)、求第K层的节点个数
//求第k层的结点数 int TreeKLevel(BTNode* root,int k) {if (root == NULL){return 0;}if (k == 1)return 1;return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1); }如求第三层,即为求第一层的第三层==求第二层的第二层==求第一层的第一层,利用k--1,每递归依次,就进行一次k-1表示到达下一层,当k==1时,即当前层数为要求节点数的层数,若root为NULL,即没有该节点,返回0;若k!=1,root不等于NULL,即还没有到达要求层数,则继续向下层递归。
本次知识到此结束,希望对你有所帮助!
相关文章:
数据结构——链式二叉树
目录 🍁一、二叉树的遍历 🌕(一)、前序遍历(Preorder Traversal 亦称先序遍历) 🌕(二)、中序遍历(Inorder Traversal) 🌕(三)、后序遍历(Postorder Traver…...
SpringSecurity笔记
SpringSecurity 本笔记来自三更草堂:https://www.bilibili.com/video/BV1mm4y1X7Hc/?spm_id_from333.337.search-card.all.click,仅供个人学习使用 简介 Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro,…...
常见递归算法题目整理
常见递归算法题目整理 一、单路递归1、阶乘计算2、翻转字符串3、二分查找 二、多路递归1、斐波那契1)基础版2)缓存版 2、汉诺塔3、杨辉三角1)基础版2)缓存版3)优化缓存版 ) 一、单路递归 1、阶乘计算 public class …...
安全小记-Ngnix负载均衡
配置Ngnix环境 1.安装 创建Nginx的目录: mkdir /soft && mkdir /soft/nginx/ cd /home/centos/nginx下载Nginx安装包通过wget命令在线获取安装包: wget https://nginx.org/download/nginx-1.21.6.tar.gz解压Nginx压缩包: tar -x…...
CI/CD
介绍一下CI/CD CI/CD的出现改变了开发人员和测试人员发布软件的方式,从最初的瀑布模型,到最后的敏捷开发(Agile Development),再到今天的DevOps,这是现代开发人员构建出色产品的技术路线 随着DevOps的兴起,出现了持续集成,持续交付和持续部署的新方法,传统的软件开发和交付方…...
window下如何安装ffmpeg(跨平台多媒体处理工具)
ffmpeg是什么? FFmpeg是一个开源的跨平台多媒体处理工具,可以用于录制、转换和流媒体处理音视频。它包含了几个核心库和工具,可以在命令行下执行各种音视频处理操作,如剪辑、分割、合并、媒体格式转换、编解码、流媒体传输等。FFmpeg支持多…...
MySQL必看表设计经验汇总-上(精华版)
目录 1.命名要规范 2选择合适的字段类型 3.主键设计要合理 4.选择合适的字段长度 5.优先考虑逻辑删除,而不是物理删除 6.每个表都需要添加通用字段 7.一张表的字段不宜过多 前言 在数据库设计中,命名规范、合适的字段类型、主键设计、字段长度、…...
扫雷游戏(C语言)
目录 一、前言: 二、游戏规则: 三、游戏前准备 四、游戏实现 1、打印菜单 2、初始化棋盘 3、打印棋盘 4、布置雷 5、排雷 五、完整代码 一、前言: 用C语言完成扫雷游戏对于初学者来说,难度并不是很大,而且通…...
五、MySQL的备份及恢复
5.1 MySQL日志管理 在数据库保存数据时,有时候不可避免会出现数据丢失或者被破坏,这样情况下,我们必须保证数据的安全性和完整性,就需要使用日志来查看或者恢复数据了 数据库中数据丢失或被破坏可能原因: 误删除数据…...
使用dockers-compose搭建开源监控和可视化工具
简介 Prometheus 和 Grafana 是两个常用的开源监控和可视化工具。 Prometheus 是一个用于存储和查询时间序列数据的系统。它提供了用于监控和报警的数据收集、存储、查询和图形化展示能力。Prometheus 使用拉模型(pull model),通过 HTTP 协议…...
浏览器——HTTP缓存机制与webpack打包优化
文章目录 概要强缓存定义开启 关闭强缓存协商缓存工作机制通过Last-Modified If-Modified-Since通过ETag If-None-Match 不使用缓存前端利用缓存机制,修改打包方案webpack 打包webpack 打包名称优化webpack 默认的hash 值webapck其他hash 类型配置webpack打包 web…...
STM32duino舵机控制-2
使用定时器进行精确延时,串口接收数据进行 50 0度 --十六进制32 250 180度 --十六进制FA 串口接收到AA 32两个字节,舵机转到0度;接收到AA FA,转到180度。请验证代码: const unsigned…...
【知识---如何创建 GitHub 个人访问令牌】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言登录到 GitHub 帐户。在右上角的头像旁边,点击用户名,然后选择 "Settings"。在左侧导航栏中,选择 "Develope…...
GBASE南大通用分享-ConnectionTimeout 属性
GBASE南大通用分享 获取或设置连接超时时间,值为‚0‛时没有限制。 语法 [Visual Basic] Public Overrides ReadOnly Property ConnectionTimeout As Integer Get [C#] public override int ConnectionTimeout { get; } 实现 IDbConnection.Connecti…...
ChatGPT 全域调教高手:成为人工智能交流专家
随着人工智能的快速发展,ChatGPT作为一种强大的文本生成模型,在各行各业中越来越受到重视和应用。想要利用ChatGPT实现更加智能、自然的交流,成为 ChatGPT 全域调教高手吗?本文将为您介绍如何通过优化ChatGPT的训练方法࿰…...
5.Hive表修改Location,一次讲明白
Hive表修改Loction 一、Hive中修改Location语句二、方案1 删表重建1. 创建表,写错误的Location2. 查看Location3. 删表4. 创建表,写正确的Location5. 查看Location 三、方案2 直接修改Location并恢复数据1.建表,指定错误的Location࿰…...
基于springboot校园台球厅人员与设备管理系统源码和论文
在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括校园台球厅人员与设备管理系统的网络应用,在外国管理系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段。校园台球厅人员与设备管理系统具…...
MySQL(下)
四、事务 一、概念 对数据库的一次执行中有多条sql语句执行。这多条sql在一次执行中,要么都成功执行,要么都不执行。保证了数据完整性。MySQL中只有innodb引擎支持事务。 二、特性 事务是必须满足 4 个条件(ACID)&#x…...
如何搭建开源笔记Joplin服务并实现远程访问本地数据
文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具,拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能,…...
免费分享一套微信小程序外卖跑腿点餐(订餐)系统(uni-app+SpringBoot后端+Vue管理端技术实现) ,帅呆了~~
大家好,我是java1234_小锋老师,看到一个不错的微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现) ,分享下哈。 项目视频演示 【免费】微信小程序外卖跑腿点餐(订餐)系统(uni-appSpringBoot后端Vue管理端技术实现)…...
UniApp跨平台开发入门:用现有Vue代码快速生成小程序/App(2023最新版)
UniApp跨平台开发实战:2023年Vue代码高效迁移指南 移动互联网时代,开发者常面临一个核心挑战:如何用最小成本将Web应用扩展到移动端。如果你手头已有成熟的Vue项目,UniApp可能是最经济的跨平台解决方案——它允许你复用80%以上的现…...
开源工具SMUDebugTool:系统优化与性能调优的终极解决方案
开源工具SMUDebugTool:系统优化与性能调优的终极解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:/…...
vscode|无法连接到远程扩展主机服务器 (错误: CodeError(AsyncPipeFailed(Os { code: 2, kind: NotFound, message: “No such
无法连接到远程主机服务器(错误: CodeError(AsyncPipeFailed(Os { code: 2, kind: NotFound, message: "No such file or directory" })))这是一个典型的 VSCode Remote-SSH 连接失败 错误。虽然本地网络正常、服务器在线,但 VSCod…...
PyTorch内存优化实战:深入解析torch.utils.checkpoint的机制与应用
1. 为什么我们需要torch.utils.checkpoint? 第一次用PyTorch训练ResNet50时,我的16GB显存直接被撑爆了。当时怎么都想不明白——明明batch_size只设了32,怎么连这种经典模型都跑不动?后来才发现,问题出在前向传播时PyT…...
从编译错误到成功运行:手把手教你用CMake在Ubuntu 20.04上部署GeographicLib地理计算库
从编译错误到成功运行:手把手教你用CMake在Ubuntu 20.04上部署GeographicLib地理计算库 在Linux环境下部署开源库时,许多开发者会直接复制粘贴教程中的命令,却对背后的构建原理一知半解。以GeographicLib为例,这个被广泛应用于地理…...
告别手动记录!用CAPL脚本的file系列函数自动生成CANoe测试报告
告别手动记录!用CAPL脚本的file系列函数自动生成CANoe测试报告 在汽车电子测试领域,工程师们每天都要面对海量的测试数据——从总线负载率到错误帧统计,从信号值波动到时间戳记录。传统的手动截图、复制粘贴方式不仅效率低下,还容…...
如何用A_B测试优化AI模型的业务指标?
如何用A/B测试优化AI模型的业务指标? 关键词:A/B测试、AI模型优化、业务指标、实验设计、数据驱动决策、模型迭代、统计显著性 摘要:本文深入探讨如何利用A/B测试方法来优化AI模型的业务指标。我们将从基础概念出发,通过生活化的比喻解释A/B测试原理,详细分析其在AI模型优…...
告别重装!用Timeshift给你的Ubuntu系统做个‘时光机’,轻松备份与整盘迁移
用Timeshift打造Ubuntu系统的时光回溯神器:零门槛备份与迁移指南 每次系统崩溃后重装Ubuntu的痛苦,相信不少用户都深有体会——那些精心配置的开发环境、收藏多年的工作文档、调试许久的个性化设置,都可能在一瞬间化为乌有。对于习惯图形化操…...
3种颠覆式方案:让IDM突破限制的秘密
3种颠覆式方案:让IDM突破限制的秘密 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 作为技术侦探,我们经常遇到用户反馈IDM试用到期的困扰…...
AI万能分类器零基础入门:5分钟搭建无需训练的文本分类系统
AI万能分类器零基础入门:5分钟搭建无需训练的文本分类系统 1. 引言:为什么选择零样本分类? 想象一下这样的场景:你刚接手一个新项目,需要快速对大量用户反馈进行分类。传统方法要求你收集数据、标注样本、训练模型&a…...





