C语言数据结构易错知识点(4)(二叉树、分治思想)

1.二叉树的特点:和顺序表、链表有所差异的是,二叉树并不主要用于存储数据,它多用于数据的筛选、处理等操作。二叉树内核是分治思想对递归运用的要求很高,这在二叉树的各种接口的实现上我们都能有所体会。

2.最小子问题递归条件二叉树的各种功能实现基本上都绕不开递归,解决这些问题需要用到递归,但递归的抽象程度很容易让人被绕进去,所以我们可以通过最小子问题和递归条件来理解、写代码。

核心:找左子树、右子树和当前树的关系(分治)

下面我会针对一些接口的实现来讲解如何寻找最小子问题和递归条件:

➀前序遍历(中左右):这个接口的实现在代码上很简单,但我们要进一步了解如何理解代码:

前序遍历可以被拆分为:当前树的根的值打印+左子树的根的值打印+右子树的根的值打印。

我们可以通过画一些很简单的树来检验我们的最小子问题:

同时,这种特例也可以帮我们找到递归条件,即树的根不能为空

找特例推荐使用以下两种形式,一般可以覆盖所有情况,同时也能很快地模拟:

➁树的高度:这个例子更能体现分治思想,树的高度等于左子树的高度和右子树的高度的较大者 + 1(当前树),找到这个最小子问题我们就能首先写出返回值:

通过上面的思路我们能确定return语句一定长这样,虽然其它细节还没有确定,确定了这一步其它的就不算太难了。

要写出剩余的代码,我们要举特例来进行探索:

这下,我们就能找出递归条件了:

那么,最关键的问题是:左子树和右子树的高度怎么求?

我们刚刚的分析是以根为起点来进行分析的,根的左子树和根的右子树的高度最大值+根所占的1个高度 == 树的高度。那么我们可以将左子树的第一个结点作为新的根,用上述方法来求其高度。

我们可以用例子来检验:

这里有一个问题,为什么不能将代码按下面的方式来替换?

这样似乎更加简便,但基本上所有人都能看出来这样函数调用次数会增加。但增加多少次呢?

大部分人认为只是翻倍,但仔细分析发现并不如此。我们之前的那种写法的时间复杂度是O(N),因为你可以想象每个结点都只访问了1次。但这种写法的时间复杂度达到了O(2 ^ N),并不是2N,下面分享如何分析的:
首先我们知道时间复杂度是针对最坏情况的预估,在刚刚那种写法下,最坏的情况就是树的结点都以链状结构连在一起,具体分析如下:

➂第k层结点的个数:找最小子问题联系当前树,左子树,右子树。我们发现以当前树的根为参考时,第k层的结点数相当于左子树和右子树在k - 1层的结点数之和,因此return语句又能先写出来了

要完善其余代码,继续举出特例:

我们发现,当k == 1时比较特殊,如果在k == 1时再向下递归似乎就无意义了,而此时访问到的结点都是我们想要统计的结点,如果访问到了就返回1给上一层函数。

举特例要多个防止某些情况不成立。按照上面推荐的方法,还有一种例子似乎存在漏洞:

如果传的子树为NULL,自然那里是没有节点的,也没有左右子树的,所以直接向上返回0即可

如此一来,我们的代码就完成了

当然,实际过程肯定没有这么顺畅,我们可以多检验我们代码的可行性。

➃寻找某个结点并返回其地址:首先来寻找最小子问题,这个结点要么在这棵树的根上,要么就在它的左子树中或者右子树中,也有可能根本不存在。我们可以先在当前根上找,在将左子树的第一个结点当成根继续找,形成了递归。但是,和上面不同的是,这里很难直接通过一条return解决问题,需要分好几种情况。

这时我们要根据递归的思路来走。如果根上找不到,会在左子树的第一个结点上找,找不到则又会以其左子树第一个节点为根来找,以此类推,如果都找不到,那么最后会停在NULL上,如果找到了,就返回其地址:

但是这只是递归条件,更重要的return的逻辑并没有写出来。此时我们要想,这个返回的NULL或root会对上一层函数有什么影响。如果是NULL,这个子树找不到,要到另一颗子树上找。如果是root,就没必要找了,直接层层返回就可以了。因此有如下代码:

总结:1.root为NULL一定要考虑,一定会作为递归条件之一;

2.可以像上面我的分析那样先通过最小子问题写出return语句,再通过特例来完善代码

3.找最小子问题要拆分成当前树、左子树、右子树的关系。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统 安装docker

安装: 1、Docker要求CentOS系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本是否支持安账docker 2、更新yum包: sudo yum -y update 3、安装需要的软件包,yum-util 提供yum-config-manager功能,另外…

Excel双击单元格后弹窗输入日期

Step1. 在VBE界面新建一个窗体(Userform1),在窗体的工具箱的空白处右键,选中添加附件,勾选Calendar control 8.0,即可完成日历的添加。 PS:遗憾的是, Office 64 位没有官方的日期选择器控件。唯一的解决方案是使用Excel 的第三方日历。 参考链接:How to insert calen…

多图回顾|MoonBit 首场线下 MeetUp 回顾

3 月 23 日,MoonBit 首场线下 MeetUp 活动在深圳顺利举办。 在首场 MoonBit 线下 MeetUp 活动中,五位行业内的知名专家带来了四个以探索国产基础软件新发展为主题的精彩内容分享! 一起来看看嘉宾们带来了哪些行业内的最新思考吧! …

推荐一种Bean注入方式——开发经验

我们都知道三种Bean注入的方式分别是属性注入,setter方法注入,构造器注入。这三种Bean注入的方式各有优缺点,但是相对来说更推荐使用构造器注入的方式。 1、构造器注入的优缺点 优点: 1、可以注入不可变对象 因为构造方法注入是…

【MATLAB源码-第168期】基于matlab的布谷鸟优化算法(COA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境: MATLAB 2022a 1、算法描述 布谷鸟优化算法(Cuckoo Optimization Algorithm, COA)是一种启发式搜索算法,其设计灵感源自于布谷鸟的独特生活习性,尤其是它们的寄生繁殖行为。该算法通过模拟布谷鸟在自然界中…

Unity类银河恶魔城学习记录11-3 p105 Inventory UI源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_itemSlot.cs using System.Collections; using System.Collections.Gen…

马上入局:2024年阿里云服务器优惠价格,刷新你的认知!

2024年阿里云服务器优惠价格表,一张表整理阿里云服务器最新报价,阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单,大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

【第二部分--Python之基础】

一、初识 开发语言: 高级语言:Python Java PHP C# Go Ruby C ... > 字节码 低级语言:C 汇编 > 机器码 …

C++中atan和atan2

atan和atan2 两者都在cmath函数中。 atan std::atan(1. / 1.) * 180 / M_PI // 45 deg std::atan(-1. / -1.) * 180 / M_PI // 45 deg atan2 std::atan2(1., 1.) * 180 / M_PI // 45 std::atan2(-1., -1.) * 180 / M_PI // -135 区别 atan值域[-M_PI / 2., M_PI / 2.] a…

【Windows驱动篇】解决Windows驱动更新导致AMD Software软件无法正常启动问题

【Windows驱动篇】解决Windows驱动更新导致AMD Software软件无法正常启动问题 【操作可能有风险,请提前做好数据备份,设置系统还原点等,防止系统出现问题!!!】 【操作可能有风险,请提前做好数…

达梦数据库命令行安装+命令行创建实例

首先创建dmdba用户 groupadd dminstall useradd -g dminstall dmdba sudo passwd dmdba 修改dmdba的权限 cd /etc/security/ limits.d 增加两行代码 dmdba soft nofile 65536 dmdba hard nofile 65536 创建安装文件夹 授权dmdba mkdir -p /app/dbDB8 mkdir installDa…

redis实际应用场景及并发问题的解决

业务场景 接下来要模拟的业务场景: 每当被普通攻击的时候,有千分之三的概率掉落金币,每回合最多爆出两个金币。 1.每个回合只有15秒。 2.每次普通攻击的时间间隔是0.5s 3.这个服务是一个集群(这个要求暂时不实现) 编写接口&…

代码随想录算法训练营第三十四天 |1005. K 次取反后最大化的数组和 、134. 加油站、135. 分发糖果

代码随想录算法训练营第三十四天 |1005. K 次取反后最大化的数组和 、134. 加油站、135. 分发糖果 1005. K 次取反后最大化的数组和题目解法 134. 加油站题目解法 135. 分发糖果题目解法 感悟 1005. K 次取反后最大化的数组和 题目 解法 考虑绝对值 class Solution { public…

libVLC 视频裁剪

使用 libVLC 进行视频裁剪并不是直接支持的功能,因为 libVLC 主要是一个媒体播放库。然而,你可以通过调整播放窗口的大小和设置视频输出的区域来实现一种“视觉上的裁剪”。这意味着视频本身并没有被修改,但可以控制显示给用户的视频区域。 …

【OJ】动归练习二

个人主页 : zxctscl 如有转载请先通知 题目 1. 91.解码方法1.1 分析1.2 代码 2. 62.不同路径2.1 分析2.2 代码 3. 63.不同路径 II3.1 分析3.2 代码 1. 91.解码方法 1.1 分析 题目所述就是把一串数字反向解码为字母映射出来,有多少种方法。 题目也说&…

基于java+SpringBoot+Vue的篮球竞赛预约平台设计与实现

基于javaSpringBootVue的篮球竞赛预约平台设计与实现 开发语言:Java数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 篮球竞赛预约平台以springboot作为框架,b/s模式以及MySql作为后台运行的数据库&a…

线程池的7大参数

线程池的7大参数 一、 corePoolSize 线程池核心线程大小 核心线程永远不会销毁,即使他们处于空闲状态,除非设置了allowCoreThreadTimeOut。任务提交到线程池后,首先会检查当前线程数是否达到了corePoolSize,如果没有达到的话&…

蜜罐技术简介

1.什么是蜜罐 蜜罐技术本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击。这种技术允许防御方捕获和分析攻击行为,从而了解攻击方所使用的工具与方法,推测攻击意图和…

360奇酷刷机 360刷机助手 QIKU Download Assistant

360奇酷刷机 360刷机助手 QIKU Download Assistant 破 解 360手机刷机资源下载链接:360rom.github.io 参考:360手机-360刷机360刷机包twrp、root 360奇酷刷机:360高通驱动安装 360手机刷机驱动;手机内置,可通过USB文件…

2核4g服务器能支持多少人访问?全网最全测评

腾讯云轻量应用服务器2核4G5M配置性能测评,腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?并发数10,支持每天5000IP人数访问,腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线?并发数测试、CPU性能、内存性能、…