【数据结构之二叉树】——二叉树的概念及结构,特殊的二叉树和二叉树性质_二叉树表示精馏序列-程序员宅基地

技术标签: 算法  数据结构和算法  数据结构  


一、二叉树的概念及结构

1.概念

一棵二叉树是结点的一个有限集合,该集合:

  1. 或者为空
  2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成
    在这里插入图片描述
    如上图就是二叉树,可以看出:
    1.二叉树每个节点的度<=2

2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

注意:对于任意的二叉树都是由以下几种情况复合而成的:

在这里插入图片描述

2.现实中的二叉树

在这里插入图片描述

3. 特殊的二叉树:

1)满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^K-1 ,则它就是满二叉树。

在这里插入图片描述

如上图:这是一棵满二叉树:
推导:

在这里插入图片描述
该二叉树的高度是h = 4.
则该二叉树的节点总数Sn = 2^0 + 2^1 + 2^2 + …+2^h-1

由等比数列求前n项和公式:
在这里插入图片描述
带入数据:
Sn = 2^h -1 (Sn为二叉树节点总数,h为树的高度)

所以这就是一棵标准的满二叉树。

如果我们知道一棵满二叉树的总节点个数,也可以推导出改满二叉树的节点的高度

推导如下:
在这里插入图片描述

h = log2(Sn+1)

2)完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

通俗地讲:
1)前面每层节点的度都是2
2)最后一层节点必须连续

要注意的是满二叉树是一种特殊的完全二叉树。
比如说下面这个:

在这里插入图片描述
解释如下:
在这里插入图片描述

如果是这几种情况,就不是完全二叉树:
在这里插入图片描述
因为它们不符合第二点要求:最后一层是连续的。

由满二叉树和二叉树的定义可知,满二叉数是特殊的完全二叉树。

类似地:当我们知道完全二叉树的节点数,可以推导完全二叉树的高度:
在这里插入图片描述

3.二叉树的性质

1. 若规定根节点的层数为1,则一棵非空二叉树的第n层上最多有2^(n-1) 个结点.
2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h - 1 .
3. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h= log2(n+1). (ps: 是log以2为底,n+1为对数)

4. 对任何一棵二叉树, 如果度为0其叶结点个数为n0, 度为2的分支结点个数为n2 ,则有 n0= n2+1
第四点解析:
以下图为例,度为0的节点的个数有4个,度为2的节点的个数有3个,则n0 = n2 + 1
在这里插入图片描述

5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对
于序号为i的结点有:

1)若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点

2)若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子

3) 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子
在这里插入图片描述

以该例子为例套进去即可。

前面三点是上面推导过的,第四点和第五点是重点要记忆的


二、二叉树练习题

1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,
 则该二叉树中的叶子结点数为( )
A 不存在这样的二叉树
B 200
C 198
D 199

解析:

运用上面所讲的性质四即可秒杀。
4. 对任何一棵二叉树, 如果度为0其叶结点个数为n0, 度为2的分支结点个数为n2 ,则有 n0= n2+1

度为2的节点有199个,即n2 = 199,那么度为n0的节点 = n2+1 = 200

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

解析:

假设这棵完全二叉树的度为0,1,2的节点个数分别为:
x0 ,x1,x2
有: x0+x1+x2 = 2n
又根据性质四,x0 = x2 + 1,所以化简一下得:
x2+1+x1+x2 = 2n
对于一棵完全二叉树来说,度为1的节点的个数要么为0,要么为1
在这里插入图片描述
以上面这棵完全二叉树为例,度为1的节点只有1个
在这里插入图片描述
以上面这棵完全二叉树的节点为例:度为1的节点有0个。
所以对于任何一颗完全二叉树来说,度为1的节点只有1个或0个。
则x1 = 1或x1 = 0
当x1 = 1时,
x2+1+x1+x2 = 2n -->2*x2 + 2 = 2n,
所以x2 = n

而当x1 = 0时,2*x2+1 = 2n,x2 = (2n-1)/2,节点个数不可能为小数,所以不成立
所以该完全二叉树的度为1的节点个数为n

3.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )
A 11
B 10
C 8
D 12

解析:
以这棵二叉树为例:
对于一棵完全二叉树,节点个数与高度的关系有:
n = 2^h-1-x(x为完全二叉树最后一层中缺少的节点的个数)
缺少的节点是相对于满二叉树来说的。
在这里插入图片描述
x的最好情况和最坏情况如下:
在这里插入图片描述

当h = 10时,节点个数为 2^10 - 1 - x ,
此时x的取值范围是[0,2^9-1-1],即[0,510]
代入原数据 531 = 2^10 -1 -x,x = 492,在取值范围内。

当n = 11时,节点个数为2^11 -1 -x,
此时x的取值范围是[0,2^10-1-1],即[0,1022]
代入原数据 531 = 2^11 -1 -x,x = 1516,不在取值范围内,不成立。
而对于当h = 12时,更不可能了。
对与h = 8,2^8 = 256,也不可能
所以h = 10,选B

4.一个具有767个节点的完全二叉树,其叶子节点个数为()
A 383
B 384
C 385
D 386

解析:

这道题的解法与第2题解法相同
直接画图分析:
在这里插入图片描述

总结

熟知二叉树的相关知识概念和性质,非常有助于进一步二叉树广度优先搜索和深度优先搜索的学习。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/w2915w/article/details/129461046

智能推荐

QT多线程(线程互斥)_qt 互斥锁-程序员宅基地

文章浏览阅读2.5k次,点赞5次,收藏14次。线程互斥是指在多线程并发执行时,为避免多个线程访问共享资源时发生冲突而采取的一种机制。本篇文章我们就这个问题来了解一下什么叫线程互斥,又如何解决线程互斥的问题。这篇文章讲解了线程的互斥和线程的死锁,并给出了线程死锁的解决方法。_qt 互斥锁

欧几里得算法---求最大公约数_求n个整数的最大公约数-程序员宅基地

文章浏览阅读1.8k次。欧几里得算法能够求出两个数值的最大公约数。此算法的确立虽然已经过去2000多年,但因其实现逻辑简单又明确,所以至今还在沿用。具体内容如下。给出两个任意自然数 m 和 n ,为了便于说明,假设 m 总是大于等于 n 。即使如此假设也不会失去算法的通用性,因为必要时可以将 m 和 n 对调。此时,求 m 和 n 的最大公约数。int gcd(int m, int n){ in..._求n个整数的最大公约数

android edittext 实现enter键自动换行,并空自动空二格,实现文字自动排版_edittext set keycode_enter-程序员宅基地

文章浏览阅读1.7k次。功能一,近日遇到需要给输入的文字换行,并自动换二格的问题,几经周折,终于找到了解决方案先判断软键盘输入的是enter键。在这里 return true的是为了防止输入法自身遇到enter键换行,这样就会导致换二行出现。而除了enter 返回false,就是为了让其它的软键盘功能正常使用,不然删除等键全会失效!另外加一个 action_up是为了防止 这里调用2次这个方法。action_do..._edittext set keycode_enter

Linux 常用命令最全总结大全【推荐收藏】_linux常用命令 csdn-程序员宅基地

文章浏览阅读1.3k次,点赞20次,收藏35次。Linux 常用命令_linux常用命令 csdn

PHP 过滤多维数组中的空值_php array_filter 多维数组-程序员宅基地

文章浏览阅读3.9k次。/** * clearEmptyValue 清除多维数组里面的空值 * @param array $array * @return array * @author liuml * @DateTime 2018/12/3 11:27 */function array_filter_recursive(array &amp;amp;amp;amp;amp;$arr){ if (empty($arr)) ..._php array_filter 多维数组

python爬虫高级知识_Python爬虫高级入门,Scrapy框架入门级案例实战!-程序员宅基地

文章浏览阅读99次。python install Twisted这里是运行成功的截图阅读目录系列文章目录前言一、编写Tenxun.py爬虫文件二、在item.py列表里进行设置数据表三、在pipelines.py列表里进行设置数据表四、在settings.py文件里配置爬虫五、运行爬虫总结前言随着我们对爬虫的了解,以前我们用requests可以请求进行解析网页可以提供我们想要的数据 ,现在我们网页的数据量很多的时候,..._datas = json.loads(response.text).get('ret_array', list()

随便推点

【Linux】操纵进程(kill)_kill默认信号值-程序员宅基地

文章浏览阅读942次,点赞3次,收藏2次。本文探讨如何在 Linux 操纵进程。Linux 主要使用 kill 来操纵进程,即杀掉进程。kill 命令是通过发送特定的信号来操纵命令, 列出所有支持的信号。kill 命令发送的默认信号是 15(SIGTERM),即终止信号。另一个比较重要的是信号 9(SIGKILL),即强制终止信号。一般我们先使用 ps 或 top 找到需要终止的进程的 PID,然后将 PID 跟在 kill 后面即可杀掉进程。如果某些恶意进程杀不掉,可使用 强制杀掉。非必要情况,不要使用 ,因为强制终止进程可能会导致数据丢失或者_kill默认信号值

Android源码分析:AudioFlinger中的线程_mthread.promote-程序员宅基地

文章浏览阅读4.8k次。Track相关类概述下图是其继承关系图,继承在AudioBufferProvider之后,各种Track可以作为AudioBufferProvider的一种为AudioMixer提供音频数据缓冲。TrackBase是基类,Track作为普通的音轨类,用于音频播放;OutputTrack用于复制线程,相当于将声音同时输出到两个输出设备中。TrackBase在它的构造函数中,在ashm上为_mthread.promote

不同版本iOS的特性和差异_不同ios版本元素-程序员宅基地

文章浏览阅读5.5k次。1.iPhone OS 2.0 苹果在2008年3月6日iPhone SDK Roadmap会上正式介绍了iPhone OS 2.0。这个版本的获得的重要更新可以分成一下4大类:-企业增强-微软Exchange ActiveSync-iPhone SDK-App Store  在2008年6月的WWDC大会上苹果宣布包括MobileMe服务以及其他_不同ios版本元素

vue element的tabs中使用echarts_在element的tabs里面放echarts-程序员宅基地

文章浏览阅读1.9k次,点赞3次,收藏3次。tabs中使用echarts,除了第一个图表能默认显示外,当tabs切换的时候,第一个之后的可能就显示不了了,如何解决?<template> <div> <el-row> <el-col :span="24"> <el-card> <el-tabs v-model="activeName" type="card" @tab-click="handleClick"> ._在element的tabs里面放echarts

【MATLAB】椭圆检测(Ellipse Detection)算法(含代码)-程序员宅基地

文章浏览阅读5.9w次,点赞73次,收藏282次。这里分享一篇文献中椭圆检测的方法(代码使用方法)。圆的物体,在实际拍摄中由于种种原因可能会变成椭圆,用圆拟合就不够准确。_椭圆检测

微信小程序手机号授权登录_微信手机号授权登录代码-程序员宅基地

文章浏览阅读5k次,点赞5次,收藏44次。微信小程序,手机号授权登录需求。_微信手机号授权登录代码

推荐文章

热门文章

相关标签