【数据结构】关于二叉树你所应该知道的数学秘密

news2024/9/25 11:17:18

目录

1.什么是二叉树(可以跳过 目录跳转)

2.特殊的二叉树(满二叉树/完全二叉树)

2.1 基础知识

2.2 满二叉树

2.3 完全二叉树

3.二叉树的数学奥秘(主体)

3.1 高度与节点个数

3.2* 度

4.运用二叉树的数学奥秘做题

4.1 P1

4.2 P2

4.3 P3

4.4 P4


1.什么是二叉树(可以跳过 目录跳转)

数据结构当中,是一种很重要的结构,在树当中,二叉树又是极为特殊、应用广泛的一种,那什么是二叉树呢?

我们首先回忆一下“度”的概念,树是由节点组织起来的每一个节点都有自己的分叉,即自己的子树个数。如图中的 1节点,它的度就是3,因为 1节点是有三个分叉 / 子树 2 3 4。再如图中的 4节点,它的度就是1,因为 1节点是有三个分叉 / 子树 8。再比如图中的 9节点,它的度就是0,因为它压根就没有分叉 / 子树。

 而二叉树,就是在树的基础上,规定:

1. 二叉树所有节点的度都是小于等于2的,二叉树不存在度大于2的节点。通俗一点理解,二叉树的节点最多有两个叉 / 子树,也可能只有一个叉,甚至没有叉

2. 二叉树有左右子树之分,一个节点最多有两个分叉,一个节点的左边的子树叫做左子树,右边的子树叫做右子树。举个下图中的例子,3节点的左子树就是2子树,3节点的右子树就是8子树;8的左子树是6子树,8节点的右子树是空NULL(空树);4节点的左右子树都是空树NULL。还有这个节点的子树的左右顺序是固定的次序不能颠倒,也因此二叉树是有序树

 轻松一下,例如现实当中下面这棵树就是一棵二叉树(当然你需要把这棵树倒转一下看):(度都小于等于2)

2.特殊的二叉树(满二叉树/完全二叉树)

2.1 基础知识

首先对一个普通二叉树,我们要建立层与高度的概念,如图,根节点3是第一层,第一层有2个节点;节点2和节点8组成了第二层,第二层有2个节点;节点2 3 6处在二叉树的第三层,二叉树的第三层有3个节点。这棵二叉树的高度h==5

 

2.2 满二叉树

在这个基础之上,我们引入满二叉树的概念,如果一个二叉树高h,那么满二叉树就是每一层的节点的个数都达到了MAX最大值,也就是对于第k层来说,它一定有2 ^(k-1)个节点。所以根据等比数列来说,这个满二叉树它的总结点个数一定是2^0 + 2^1 +2^2 + 2^3 +...... + 2^(h-1) == 2^h  -  1个节点。反过来讲,如果一棵满二叉树的总节点个数为N,那它的高度就是log2(N+1)。

 

 如上面的三个图,第一个图和第二个图,他们都是满二叉树,因为他们的每一层节点的个数都已经达到了最大值(第k层都是2^(k-1)个节点)。但是第三个图,这个二叉树的最后一层,也就是第4层,个数没有达到这一层所能达到的最大值,所以第三个图就不是满二叉树

不过,第三个图,它虽然不是满二叉树,但是他是完全二叉树

2.3 完全二叉树

 

先不去看复杂的概念,我们假设一棵完全二叉树有h层,就拿图中这个完全二叉树,它有的高度h是4。

那么如果只看最后一层往上的h-1个层(本例中就是上3层),暂时不看最后一层(不看第4层),如果一棵整树是完全二叉树,那么上h-1层就是一棵满二叉树(你看第1 2 3层组成的二叉树就是一棵满二叉树),这是第一点完全二叉树所满足的

然后第二点,我们只看最后一层,如果一棵整树是完全二叉树,那么这最后一层(也就是图上的第4层)的所有节点在顺序上,是连续的,没有跳跃间隔的!!!关于连续的没有跳跃间隔的,我们看一下例子就明白了:

 

 看第一个图,我们看最后一层的所有节点,它就不是完全连续的,是有间断的,所以这棵树不是完全二叉树第二个图的的最后一层的所有节点,它是完全连续的,所以这棵树是完全二叉树;第三个图的最后一层的所有节点它就不是完全连续的,是有间断的,所以这棵树不是完全二叉树

所以只要满足以下两点,这就是一棵完全二叉树(设其高度为h):

1.上h-1层构成一棵满二叉树。

2.第h层所有节点在顺序上,是连续的,没有跳跃间隔的。

所以其实,一棵满二叉树一定是一棵完全二叉树,因为满二叉树上h-1层是满二叉树,且其最后一层也是连续的,没有跳跃间隔的。

3.二叉树的数学奥秘(主体)

3.1 高度与节点个数

在假设根节点是第1层不讨论空树的情况下:

秘密1:如果树有h层。对于某一层来说,比如对于第k层,这一层所有节点的个数最多是2^(k-1)个。

秘密2:如果树有h层,那这棵树总结点的最大个数,就是2^h  -  1个。

秘密3:如果一棵满二叉树的高度为h,那它的所有节点个数和2^h  -  1

如果一棵满二叉树的总节点个数和为N,那它的高度就是log2(N+1)

秘密4:如果一棵完全二叉树的高度为h,那它的所有节点个数和是在这样一个区间 :( 2^(h-1),2^h  -  1 ],左开右闭。

如果一棵完全二叉树的节点个数和为N,那么它的高度就是log2(N+1),必须注意 log2(N+1)可能不是整数,如果不是整数那就默认往大取整。其实很好区分,如果N+1恰好是2的指数的结果,那么高度就是log2(N+1),而如果N+1不是2的指数的结果,那么高度就是把N+1往大补成2的指数的结果,高度是往大取整的log2(N+1)

详情练习,请跳转至4.1。

3.2* 度

度,每一个节点都有自己的度,度就是一个节点的分叉数,即往下有多少棵子树。

对于任何一棵二叉树度为0的节点的数量,也即叶子节点的数量为n0度为2的分支节点的数量为n2。那么一定满足n0 = n2 + 1。也即度为0的节点的数量,永远比度为2的节点的数量多1个!!!

我们随便举几个例子,你可以发现度,都满足上述关系!

 如果二叉树只有一个根节点,它的度是0,度为2的节点不存在,n0 = 1,n2 = 0,n0 = n2 + 1。

 如上图二叉树,节点1的度为1,节点2的度为0,n0 = 1,n2 = 0,n0 = n2 + 1。

  如上图二叉树,节点1的度为2,节点2的度为0,节点3的度为0,n0 = 2,n2 = 1,n0 = n2 + 1。

   如上图二叉树,节点1的度为2,节点2的度为1,节点3的度为0,节点4的度是0,n0 = 2,n2 = 1,n0 = n2 + 1。

   如上图二叉树,节点1的度为2,节点2的度为1,节点3的度为1,节点4的度是0,节点5的度为0,n0 = 2,n2 = 1,n0 = n2 + 1。

由此迭代判断,其实所有的二叉树都是满足n0 = n2 + 1这个数学奥秘的。度为0的节点永远比度为2的节点的数量多一个!

简单的从数学的角度证明一下这个结论:

一棵二叉树的总度数n=度数为0的节点的数量n0×0+度数为1的节点的数量n1×1+度数为2的节点的数量n2×2。
一棵二叉树的总度数n同时=所有节点个数n0+n1+n2-1。
由上述两个式子可得n1+2n2=n0+n1+n2-1。
所以有n0=n2+1。

4.运用二叉树的数学奥秘做题

4.1 P1

1.某二叉树共有399个结点。其中有199个度为2的结点。 则读二又树中的叶子结点数为()

A. 不存在这样的二叉树
B. 200
C. 198
D. 199

提取题目信息:n0 + n1 + n2=399;n2 = 199;而且结合我们知道的数学秘密,n0 = n2 + 1;所以n0 = 200。所以题干给的第一句话是废的!我们只要通过第二句话,结合n0 = n2 + 1,就可以知道,叶子节点的个数,即度为0的节点的个数为200。故选B。

4.2 P2

2.在具有2n个结点的完全二叉树中,叶子结点个数为()
A. n
B. n+1
C. n-1
D. n/2

提取题目信息:n0 + n1 + n2 = 2n,和是一个偶数。然后这是一棵完全二叉树,完全二叉树有一个十分重要的特点,注意观察下图,度为1的节点个数只能有1个或0个!然后再无其他个数(最后一层的节点的度都是0,上面是一个满二叉树,出现度为1的节点数目只能最多有1个),所以完全二叉树中,度为1的节点个数 n1 非0即1,非1即0

 

 

 n0 = n2 + 1,这个奥秘,我们结合题设n0 + n1 + n2 = 2n,则2*n2 + 1  + n1 = 2n。等式左侧的2*n2 + 1,是一个奇数,然后这个奇数加上了n1等式的右侧2n,是一个偶数。奇数只能通过加一个奇数,才能得到偶数!所以n1是奇数。

 n1非0即1,n1是奇数,所以n1 == 1。

所以2*n2 +1 + 1 = 2n;所以度为2的节点的个数n2 = n-1。所以叶子节点的个数n0 = n2 + 1 = n - 1 + 1 = n;故选A。

4.3 P3

3.一棵完全二叉树的节点数为531个,那么这棵树的高度为()
A 11
B 10
C 8
D 12
我们直接根据3.1当中的规律,N=531,我们把N+1 == 532,log2(532),往大取整就是层数,2^9 == 512 < 532 < 2^10 == 1024,往上取整,则一共有10层。故选B。

4.4 P4

4.一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386
n0 + n1 + n2 = 767,完全二叉树n1不是1就是0,n0 + n2 = n0 + n0 - 1 = 2*n0 - 1,是一个奇数。2*n0 - 1 + n1 = 767,右侧是奇数,所以左侧的奇数2*n0 - 1,必须通过加一个偶数,才能保持其是奇数,所以n1是偶数,又n1 非1即0,所以n1 == 0。
所以2*n0 - 1 = 767,所以叶子节点的个数n0 = 768/2 = 384。故选B。

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

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

相关文章

算法拾遗二十五之暴力递归到动态规划五

算法拾遗二十七之暴力递归到动态规划七题目一【数组累加和最小的】题目二什么暴力递归可以继续优化暴力递归和动态规划的关系面试题和动态规划的关系如何找到某个问题的动态规划方式面试中设计暴力递归的原则知道了暴力递归的原则 然后设计常见的四种尝试模型如何分析有没有重复…

力扣-丢失信息的雇员

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;1965. 丢失信息的雇员二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果5.其他…

SpringBoot高级-Condition相关操作

01-SpringBoot高级-今日内容 SpringBoot自定配置SpringBoot事件监听SpringBoot流程分析SpringBoot监控SpringBoot部署 02-SpringBoot自动配置-Condition-1 Condition是Spring4.0后引入的条件化配置接口&#xff0c;通过实现Condition接口可以完成有条件的加载相应的Bean Co…

移动架构43_什么是Jetpack

Android移动架构汇总​​​​​​​ 文章目录一 Android 开发框架演变1 MVC2 MVP3 MVVM二 什么是JetPack三 如何构建支持Jetpack项目一 Android 开发框架演变 1 MVC Model-View-Controller&#xff0c;模型-视图-控制器&#xff0c;Model负责数据管理&#xff0c;View负责UI显…

创建Vite+Vue3+TS基础项目

前言&#xff1a; 本篇内容不涉及插件的安装以及配置&#xff0c;具体安装及配置篇可以看下面目录&#xff0c;本篇只涉及创建ViteVue3TS基础项目相关内容。不讲废话&#xff0c;简单直接直接开撸。 目录 npm create vite vue3练习2 -- --template vue-ts npm i vue-rout…

线性表 顺序表数组

初识线性表 文章目录初识线性表线性表的类型定义基本操作&#xff08;一&#xff09;init&#xff0c;destory&#xff0c;clear基本操作&#xff08;二&#xff09; 判空 &#xff0c;求长基本操作&#xff08;三&#xff09;取值&#xff0c;取位置基本操作&#xff08;四&am…

图解LeetCode——剑指 Offer 12. 矩阵中的路径

一、题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相…

Solon2 的应用生命周期

Solon 框架的应用生命周期包括&#xff1a;一个初始化函数时机点 六个事件时机点 两个插件生命时机点 两个容器生命时机点&#xff08;v2.2.0 版本的状态&#xff09;&#xff1a; 提醒&#xff1a; 启动过程完成后&#xff0c;项目才能正常运行&#xff08;启动过程中&…

基于麻雀算法改进的BP神经网络客流量预测,SSA-BP

目录 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数&#xff0c; BP神经网络的传递函数 麻雀算法原理 麻雀算法主要参数 麻雀算法流程图 麻雀算法优化测试函数代码 基于麻雀算法改进的BP神经网络坑基监测 数据 matlab…

Windows 11 安装 Docker Desktop

Windows 环境安装 WSL2 WSL 简介 WSL 全称是 Windows Subsystem for Linux &#xff0c;适用于 Linux 的 Windows 子系统&#xff0c;可让开发人员按原样运行 GNU/Linux 环境&#xff0c;包括大多数命令行工具、实用工具和应用程序&#xff0c;且不会产生传统虚拟机或双启动设…

低线城市外卖市场逐渐下沉,创业者如何有效开展本地外卖平台

近年来&#xff0c;我国网上外卖营业额不断上升&#xff0c;使我国餐饮业的比重越来越高。 随着外卖市场的下沉&#xff0c;低线城市的用户开始使用外卖平台 由于我国在线外卖行业逐渐成熟&#xff0c;一、二线主流市场逐渐饱和&#xff0c;外卖行业逐渐开始向低线城市发展&…

非标自动化设备远程监控解决方案

为了实现企业自动化生产&#xff0c;提高工作效率和稳定性&#xff0c;需对整个工厂进行远程监控和管理。 在工厂建立了一个远程监控系统&#xff0c;可以实现对工业自动化的设备状态进行远程实时监控&#xff0c;同时可以利用无线网络技术来实现对设备的数据采集和远程管理。 …

Guava ——Joiner和Splitter

大家好&#xff0c;这里是一口八宝周&#x1f44f;欢迎来到我的博客❤️一起交流学习 文章中有需要改进的地方请大佬们多多指点 谢谢&#x1f64f;在本篇文章中&#xff0c;我将用实例展示&#xff0c;如何使用Joiner将集合转换为 String &#xff0c;以及使用Splitter将 Strin…

如何使用EvilTree在文件中搜索正则或关键字匹配的内容

关于EvilTree EvilTree是一款功能强大的文件内容搜索工具&#xff0c;该工具基于经典的“tree”命令实现其功能&#xff0c;本质上来说它就是“tree”命令的一个独立Python 3重制版。但EvilTree还增加了在文件中搜索用户提供的关键字或正则表达式的额外功能&#xff0c;而且还…

Android性能优化系列篇:弱网优化

弱网优化1、Serializable原理通常我们使用Java的序列化与反序列化时&#xff0c;只需要将类实现Serializable接口即可&#xff0c;剩下的事情就交给了jdk。今天我们就来探究一下&#xff0c;Java序列化是怎么实现的&#xff0c;然后探讨一下几个常见的集合类&#xff0c;他们是…

sklearn中的数据预处理和特征工程

目录 一.数据挖掘的五大流程 1. 获取数据 2. 数据预处理 3. 特征工程&#xff1a; 4. 建模&#xff0c;测试模型并预测出结果 5. 上线&#xff0c;验证模型效果 二.数据预处理 1.数据无量纲化 2.preprocessing.MinMaxScaler(数据归一化) 3.preprocessing.Standard…

Linux编译器——gcc/g++(预处理、编译、汇编、链接)

目录 0.程序实现的两大环境 1.gcc如何完成 预处理 编译 汇编 链接 2.动态库与静态库 对比二者生成的文件大小 3. gcc常用选项 0.程序实现的两大环境 任何一个C程序的实现都要经过翻译环境与执行环境。 在翻译环境中又分为4个部分&#xff0c;预编译、编译、汇编与链…

Spring Cloud配置application.yml与bootstrap.yml区别及多profile配置 | Spring Cloud 6

一、前言 Spring Cloud 构建于 Spring Boot 之上&#xff0c;在 Spring Boot 中有两种上下文&#xff0c;一种是 bootstrap&#xff0c;另外一种是 application。 二、bootstrap与application (.yml/.properties) 2.1 两者区别 bootstrap.yml/bootstrap.properties 和 appl…

CHAPTER 3 Web HA集群部署 - Keepalived

Web HA集群部署 - Keepalived1. Keepalived概述1.1 工作原理1.2 核心功能1.3 拓扑图2. KeepAlived安装方式2.1 yum源安装2.2 源码包编译3. KeepAlived安装3.1 环境依赖3.2 安装nginx3.3 安装Keepalived4. Keepalived部署4.1 主备模式1. 节点配置2. 主节点配置文件3. 从节点配置…

金三银四了,准备跳槽的可以看看....

前两天跟朋友感慨&#xff0c;去年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经3月了&#xff0c;具体的金三银四也已经到来了。 对于想跳槽的职场人来说&#xff0c;绝对要已经提前做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也出来了。…