手撕链式二叉树(二)—【C语言】

news2024/11/25 13:18:03

链式二叉树(一)         http://t.csdn.cn/HWu6E

目录

1. 二叉树找值为x的节点

代码实现分析

 代码实现

递归展开图

2. 求二叉树层数

代码思路分析

代码实现 

 3. 二叉树的销毁

代码思路分析

代码实现

运行结果

4. 二叉树的一些OJ题目

1. 单值二叉树                      OJ链接跳转 

2. 检查两颗树是否相同       OJ链接跳转

3. 对称二叉树                      OJ链接跳转

4. 二叉树的前序遍历           OJ链接跳转

5. 二叉树中序遍历              OJ链接跳转

6. 二叉树的后序遍历           OJ链接跳转

7. 另一颗树的子树              OJ链接跳转


1. 二叉树找值为x的节点

代码实现分析

代码步骤分析:

1. 判断根节点是不是空,是空就返回NULL

2. 不是NULL,就判断该节点的数据是不是要找的数据,是 —>(找到了,一层一层返回上去)

3. 不是要找的数据,就开始调用左子树(如果左子树一直没找到),从最后递归到的NULL开始返回,返回到调用的地方,然后开始调用最后一层的右子树,如果左子树和右子树都递归完了,还没找到就返回NULL

4. 如果一颗二叉树左子树和右子树都有要找的值,只要先找到其中一个,该值就会被一层一层的返回上去,剩下相同的值就不会找找了

 代码实现

// 二叉树查找值为x的结点
BTNode* TreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;

	if (root->data == x)
		return root;

	BTNode* ret1 = TreeFind(root->left, x);
	if (ret1)
		return ret1;

	BTNode* ret2 = TreeFind(root->right, x);
	if (ret2)
		return ret2;

	return NULL;
}

递归展开图

举例:假设我们这里找5这个节点

注意:我这里把5的位置换了下,让他在左子树就可以被找到(还是画出的左子树的递归图


过程讲解:1. 一直递归调用左边,递归到3的左儿子是NULL,返回到调用NULL的地方,开                          始调用3的右儿子,发现也是NULL

                  2. 这时返回到调用3的地方,3是被2的左边调用的,返回后,开始递归2的右儿子

                  3. 这时要找的数据x和data相同,if条件符合,执行return,然后就开始返回上去

                  4. 首先返回到2调用右儿子的地方,if语句为真,继续返回,返回到2被1调用的地                        方

                  5. 还是if条件为真,返回出去了,这时整个递归就结束了



2. 求二叉树层数



代码思路分析

代码实现分析:

1. 先判断根节点是不是为空,为空就返回NULL,就结束了

2. 走到这里那根节点就不是空,不是空就开始一直递归树的左边,递归到3的左儿子,左儿子是空,这时if条件判断成立,就返回0,开始递归3的右儿子,右儿子也为NULL,这时左返回的层数和右返回的层数比较,由于左边和右边一样都为0,那就随便返回一个+1

3. 节点3的左右儿子都返回完了,这时开始递归调用2的右子树,右子树为空,和3返回的作比较,3返回的值大,那就返回层数2

4. 后面和3的逻辑差不多,最后就是比较节点2返回的层数和4返回的层数谁大,然会就返回给1,节点1再+1,然会就返回出去,结束整个递归


通过上面的分析可以看出,这个是二叉树遍历顺序中的后序遍历

代码实现 

int TreeDepth(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int leftDepth = TreeDepth(root->left);
	int rightDepth = TreeDepth(root->right);
	return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;

}


 3. 二叉树的销毁


代码思路分析

前中后序遍历,哪个更适合这里的二叉树销毁呢?


如果采用前序遍历去销毁,一进来就销毁根节点,节点中存着的左孩子和右孩子的指针,如果我们一进来就销毁根节点,这时的左右孩子指针就也被销毁了,不能遍历下去了

中序遍历也一样


后序遍历访问根的顺序——左子树—>右子树—>根,所以我们使用后序遍历可以轻松的避免上面的问题发生

代码实现

通过上面可以知道是后续遍历,代码步骤分析如下

1. 还是一开始就递归调用左边,递归到NULL就返回,开始递归调用右边,右边到NULL,然      后就释放节点,这时就回到2,先不销毁2,先递归2的右边,是NULL,然后就销毁节点2

2. 节点2销毁后,就返回1的右边,开始递归调用1的右孩子》》》(原理和左边相同)

void TreeDestroy(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	TreeDestroy(root->left);
	TreeDestroy(root->right);
	free(root);
}

运行结果

注意点:一般递归不好调试,我们可以借助打印,来理解

由于我们使用的是后序遍历,所以我们这里打印的销毁节点的顺序,就是后序遍历的顺序



4. 二叉树的一些OJ题目

下面是一些Leetcode上的一些二叉树练习题,价值还是蛮高的,可以点击OJ链接跳转去做题

后面小余也会出这些题目的题解和做题心得,大家可以关注下哦!

1. 单值二叉树                      OJ链接跳转 

2. 检查两颗树是否相同       OJ链接跳转

3. 对称二叉树                      OJ链接跳转

4. 二叉树的前序遍历           OJ链接跳转

5. 二叉树中序遍历              OJ链接跳转

6. 二叉树的后序遍历           OJ链接跳转

7. 另一颗树的子树              OJ链接跳转



如果觉得文章不错,期待你的一键三连哦,你个鼓励是我创作的动力之源,让我们一起加油,顶峰相见!!!

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

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

相关文章

【云原生•监控】Categraf大一统的监控数据采集器

【云原生•监控】Categraf大一统的监控数据采集器 前言 「笔者已经在公有云上搭建了一套临时环境,可以先登录体验下:」 http://124.222.45.207:17000/login 账号:root/root.2020 简介 Categraf 是一个监控采集 Agent,类似 Telegra…

KDHL-200A高压开关电阻测量仪技术参数

一、产品概述 KDHL-200A高压开关电阻测量仪操作面板采用人体工学设计,符合操作习惯,采用高频开关电源和数字电路技术,适用于开关控制设备回路电阻的测量。 测试电流采用国家标准推荐的直流100A,可在直流100A的情况下直接测得回路…

媒体公关是什么?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 常常有很多朋友问我,胡老师,你具体是从事什么行业的,能为我们做些什么呢,其实51媒体网(51 Media PR)是专注于媒体公…

员工每天带薪拉屎3至6小时,对谁更不利?

#员工每天带薪拉屎3至6小时被解雇# 事件摘要: 据劳动报报道,2015年7月开始,某公司员工王某每天在厕所停留的时间为3至6个小时。记录显示,自2015年9月7日至17日(9月13日除外)王某每天分二至三次&#xff0…

第51讲:Python定义函数时使用*定义个数可变的位置形参

文章目录 1.个数可变的位置形参概念2.定义函数时定义一个个数可变的位置形参3.个数可变的形参通常位于函数中的最后一个形参 1.个数可变的位置形参概念 定义函数时,如果无法事先确定传递的位置实参的个数,在这种情况下,可以将形参定义为个数…

AutoAI 2023峰会观察:数据驱动变革,迎接智驾未来

在驶向智驾未来的科技之路上,数据正在发挥什么样的重要作用? AutoAI 2023中国峰会盛大召开 近日,AutoAI 2023第六届无人驾驶及智能驾舱中国峰会在上海盛大召开,AutoSec 7周年年会暨中国汽车网络安全与数据安全合规峰会也于同期一起…

老手机安装apk包时出现[解析包时出现错误]

问题 在老手机上安装打包好的apk时出现了“解析包时出现错误” 环境 手机 型号:华为、荣耀Android版本: 6.0 开发环境 gradle 6.9.2Android Studio 4.2.1minSdkVersion 23 解决 打包时只使用V1签名。 总结分析 因为Android7以上,引入使…

气氛热烈 金句频出!一文看尽网易科技首期AIGC创新社沙龙

GPT狂飙,AI突进。 无数人的热情被点燃,振臂高呼“AI的iPhone时刻已经到来”。面对时代新机遇,创业者闻风而动,投资人竞相追逐,巨头纷纷入局。未来会怎样?没人能给出确切的答案。 但是,几乎已成共…

《嵌入式系统开发实践》实验三 进程通信

一、 实验目的 掌握无名管道与有名管道的进程通信;掌握消息队列的读写操作;掌握共享内存的通信机制。 二、 实验任务与要求 管道读写程序的编写与应用;消息队列的发送和接收程序的编写和应用;共享内存的创建、连接和分离编程和…

ptp4l测试-LinuxPTP\ptp4l配置与问题排查

目录 一、前言 1.1 什么是ptp4l 1.2 描述 1.3 官网连接 1.4 目的 1.5 平台 二、 平台必要软件 2.1 linux物理机 2.2 imx6ull开发板 三、检查硬件是否支持 3.1 ifconfig查看当前网卡的名称 3.2 ethtool检查驱动和网卡是否支持 四、开启ptp4l服务 4.1 方法一&#x…

Windows远程访问本地 jupyter notebook服务

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 前言 Jupyter Notebook,它是一个交互式的数据科学和计算环境,支持多种编程语言&#…

图像滤波概述

什么是图像滤波 1.图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 2.消除图像中的噪声成分叫作图像的平滑化或滤波操…

霍尔电流传感器在直流列头柜的应用

摘要:数据中心供电电源质量的好坏直接影响到IT设备的安全运行,因此对数据中心直流列头柜电源进出线实行监测非常重要,而通过霍尔电流传感器可以采集主进线电流、多路支路直流电流和漏电流。 关键词:数据中心;直流列头柜…

MySQL-多表查询(下)

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易&…

统计:SEM standar deviation of the mean [延长仪表周期 技术点]

平均值标准误差(SEM, standard deviation of the mean) SD:样本标准差 分母(n-1) SD与SEM区别: 1.SD量化了样本分散值之间的差值有多大; 2.SEM量化了对总体实际平均值的了解程度。其考虑了SD的值和样本量&…

day11 - 手写数字笔迹细化

手写数字笔迹细化 对于手写数字识别实验中,经常会遇到因为笔迹较粗导致误识别的情况,所以我们通常会先将笔迹进行细化,笔迹变细以后,数字的特征会更明显,后续进行识别的准确率就会更高。 例如数字7 和 1 &#xff0c…

2019下半年上午题

2019下半年上午题 b 选a c 最后统一单位 计算需要多少片芯片: 流水线: 也就是: 对于这一道题: c ssl:安全套接层 https:安全通道 PGP:电子邮件加密 d b a b b 受委托方和委…

WWDC2023|苹果已邀请多家VR/AR领域媒体,有望推出首款头显设备

据9to5mac报道,苹果已邀请多位VR/AR领域的记者和创作者参加今年WWDC开发者大会,其中包括UploadVR编辑Ian Hamilton、经常测试AR/VR产品的Norman Chan等,这表明苹果有望推出该领域的相关产品和服务,例如首款VR/AR头显。 根据此前…

动态规划-树形DP

树的重心 题目 链接:https://www.acwing.com/problem/content/848/ 给定一颗树,树中包含 n n n 个结点(编号 1 ∼ n 1 \sim n 1∼n)和 n − 1 n-1 n−1 条无向边。 请你找到树的重心,并输出将重心删除后&#x…

免费使用GPT4.0?搭载多模态的全新New Bing开放使用教程

目录 1 微软发布新必应2 支持文本生成图像3 支持多模态回答4 历史记录和回答导出5 支持插件化导入 1 微软发布新必应 5月4日,微软基于ChatGPT的搜索引擎New Bing发布了一次大规模更新,并宣布已开放给所有用户,现在无需再排队等待&#xff0c…