首页 > 其他分享 >数据结构-->二叉树_02

数据结构-->二叉树_02

时间:2023-04-15 17:36:18浏览次数:30  
标签:02 10 结点 -- oss process 二叉树 image

今天,接着上一期的博文,继续推进!!

请看下面的的代码 :>

数据结构-->二叉树_02_深入理解二叉树的某一层结点个数

求一棵树的高度,为何需要存储起来呢?

解答这个问题之前,需要稍微改动一下,上述的代码!会发现上述代码有很大的好处!

//二叉树的高度
int TreeHight(BTNode* root)
{
	if(root == NULL)
  {
  	return 0;
  }
  
  return TreeHight(root ->leftChild) > TreeHight(root ->rightBrother) 
    																	? TreeHight(root ->leftChild) + 1 
    																	: TreeHight(root ->rihgtBrother) + 1;
}

好了,各位好友!!再一次手搓了一遍求树的高度的代码!!

我们发现上述的改动很明显!!那就是我们删掉了保存值!!

那么这样会引发什么问题呢?

其实,还是直接先说答案好了。没有保存值的情况下,会造成递归遍历的次数成指数增长!!

举一个例子,请看下图 :>

数据结构-->二叉树_02_深入理解二叉树的某一层结点个数_02


如果没有保存值的情况下,对于最底层的数字,被访问次数会大到超乎想象!!

假如,访问的是层级为10的话,那么它的次数是1024次

而当层级是20的时候,它的次数是100万!

而当层级为30的时候,被访问的次数将会达到10亿!!

是不是看着这些数字,特别敏感,其实这是一个等比数列 :> 2^n

上述的次数,是由递归展开图,总结出来的!!

显然,这样子,此种很挫的写法。时间复杂度就是 O(n^2)

其实,求 树的最大高度,对于底层的访问仅仅一次就可以了!此时,时间复杂度是O(n)

希望老友们,可以好好体会!!在这里,对递归的要求是蛮高的!!

另外,还要说明一下, 代码中 有一个 “+ 1”是怎么回事!!

数据结构-->二叉树_02_讲解二叉树的高度_03

-----> 当递归完成左子树或者右子树的时候,此时的高度是 从子树到叶子结点的距离,而一开始的子树到根的距离还有一个单位的长度!!

下面,开始另一段代码 :>

数据结构-->二叉树_02_讲解二叉树的高度_04

另外,还遗漏了一个小细节,这里的 K 的取值范围,是需要断言一下的!

------> 断言 K 的范围 “assert(K > 0);”

其实这段代码,比刚才的求树的高度难度有所提升,理解上更进了一步!!

那么,该如何解读才可以呢!在这里,涉及到相对距离,什么意思呢?

请看下列图示 :>

数据结构-->二叉树_02_深入理解二叉树的某一层结点个数_05

上述二叉树层为四层数,而现在求的是第三层的结点个数!相对位置怎么样呢?---> K == 3

那么从根结点开始相对于第三层就是距离3个单位

对于第二层而言,便是距离为2个单位

则第三层,距离就是1个单位了

为了方便理解,递归过程的展开图是要画出来的!请看下面图示 :>

数据结构-->二叉树_02_深入理解二叉树的某一层结点个数_06

在这里并没有什么所谓 0层!0层没有任何意义!!

这个时候再看一下代码,是不是理解就容易多了!!其实核心思想:相对位置的理解

注意,空子树的时候就返回 0 就可以了;那么 K == 4 层级的时候,显然是返回 1 个结点,毕竟 结点 5 的右子树是空树嘛!

至此,上一期学到的内容,重要的难点和一些细节,就已经讲解完成了!!各位老友,有没有真正 Get 到

标签:02,10,结点,--,oss,process,二叉树,image
From: https://blog.51cto.com/u_15808800/6192375

相关文章

  • 一文弄懂Python中的内存管理
    1.引言Python是一种解释性语言,这意味着它在运行之前不需要编译。当Python程序运行时,它会动态地为所有变量和对象分配相应的内存。这意味着Python的内存管理是自动处理的,使得开发人员能够专注于编写代码,而不用担心相关内存分配和释放。本文就Python的内存管理进行详述,闲话少说,我们......
  • 1~3年开发工程师的所有软件都在这里了(附云盘链接),点个赞不过分吧?(持续更新)
    一、开发系列1.1开发工具1.1.1JDK系列(8、11、17、19)1)Windows官方:8:https://www.oracle.com/java/technologies/downloads/#java8-windows11:https://www.oracle.com/java/technologies/downloads/#java11-windows17:https://www.oracle.com/java/technologies/downloads/#jdk17-wind......
  • Markdown 学习
    Markdown学习 标题操作:井号#加空格加标题名字一个#一级标题,两个#二级标题,最多六个 字体Hello,World!Hello,World!Hello,World!Hello,World!操作:两边两个*,黑体两边一个*,斜体两边三个*,斜体加粗两边两个~,横线删除线 引用狂神说Java操作:大于号>加空......
  • [oeasy]python00134_[趣味拓展]python起源_历史_Guido人生_ABC编程语言_Tanenbaum
    python历史回忆上次内容颜文字是kaomoji把字符变成一种图画的方法一层叠一层很多好玩儿的kaomoji是一层层堆叠起来的meme虚拟的表情也在真实世界有巨大影响一步步地影响字符编码就是这样一步步发展过来的python也是一步步发展到今天的python究竟是怎么发展的呢?......
  • 万字长文,带你彻底搞懂 HTTPS(文末附实战)
    大家好,我是满天星,欢迎来到我的技术角落,本期我将带你一起来了解HTTPS。前言其实网上写HTTPS的文章也不少了,但是不少文章都是从原理上泛泛而谈,只讲概念,没有讲原因,作为小白,看完还是会有一种似懂非懂的感觉。本文尝试从HTTP开始,一步一步深入到HTTPS,告诉你HTTPS到底是什么、为什......
  • ThreadLocal 简单介绍
    目录一、什么是ThreadLocal?二、ThreadLocal如何使用?三、ThreadLocal的实现原理是什么?1、set()方法2、ThreadLocalMap3、get()方法4、remove()方法5、总结四、ThreadLocal数据共享五、ThreadLocal在Java中的应用场景有哪些?六、常见问题1、Entry的key为什么设计成弱引用?2、ThreadLo......
  • mongoDB 3.0 安全权限访问
    mongoDB3.0访问控制改了很多,需要你老老实实的去看文档去验证,谷歌百度出来的多半就是错误的。还需要注意这个参数authenticationMechanisms。为了兼用2.6版本,我直接指定下面的参数:setParameter:authenticationMechanisms:MONGODB-CR下面看看如何创建访问控制权限不使用—aut......
  • Q:数据库方法的传播特性,外层方法的事务注解@Transactional默认会影响本方法么
    外层方法的事务注解默认会影响本方法么涉及知识:事务的传播特性实验前推测:目前了解内、外方法某个发生异常执行回滚是否影响另一个方法是由配置的哪个传播特性决定的。推测内方法出现异常要导致外方法的事务也要回滚,因为这个在现实场景最普遍。实验:描述:roleService.inse......
  • 国产监控之光-夜莺监控(Nightingale)
    国产监控之光-夜莺监控(Nightingale)夜莺是什么?夜莺是一个服务端组件,类似Grafana,可以对接不同的TSDB时序数据库作为数据源,支持的TSDB时序数据库如Prometheus、VictoriaMetrics、Thanos等等,只要数据进到这些库里了,夜莺就可以对数据源的数据进行分析、告警、可视化,以及后续的事件处理......
  • MC 沙漠神殿**还原
    #include<iostream>#include"minecraft.h"usingnamespacestd;TxMinecraftmc;intx=-864,y=150,z=280;intmain(intargc,char**argv){boolcon=mc.ConnectMinecraft("zk.makeblock.net.cn","a9d44e758f6e4cf8b2da2624156f24......