【数据结构之二叉树】——二叉树的概念及结构,特殊的二叉树和二叉树性质

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 一、二叉树的概念及结构1.概念一棵二叉树是结点的一个有限集合,该集合:或者为空由一个根节点加上两棵别称为左子树和右子树的二叉树组成

一、二叉树的概念及结构

1.概念

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

  1. 或者为空
  2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成



aa27d358c2684c07bf91aa6186832962.png

一、二叉树的概念及结构

1.概念

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

  1. 或者为空
  2. 由一个根节点加上两棵别称为左子树和右子树的二叉树组成


d7e933a003b94925b7feae5e1691ad9d.png

2.现实中的二叉树


image.png

3. 特殊的二叉树:

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

image.png

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

推导:


image.png

该二叉树的高度是h = 4.

则该二叉树的节点总数Sn = 2^0 + 2^1 + 2^2 + …+2^h-1

由等比数列求前n项和公式:


dd0000389b8648f2b9cec890b3740d79.png

带入数据:

Sn = 2^h -1 (Sn为二叉树节点总数,h为树的高度)

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

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

推导如下:


f17652a04aab489cafcc86c5e1f63599.png

h = log2(Sn+1)

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

通俗地讲:

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

要注意的是满二叉树是一种特殊的完全二叉树

比如说下面这个:


23d357f72159433b8231838ce9d856a8.png

解释如下:


0dcd4f1ff2664659a70735a5b6ddca5a.png

如果是这几种情况,就不是完全二叉树:


bd6bd71635524051accf1591ed935072.png

因为它们不符合第二点要求:最后一层是连续的。

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

类似地:当我们知道完全二叉树的节点数,可以推导完全二叉树的高度:


072ea81bffaf4facba330fbb9c0a36bf.png

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

897600474f484c85acaee1ab693aa7d9.png


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

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

2)若2i+1=n否则无左孩子

3) 若2i+2=n否则无右孩子

ad55ca4a2c6d4624875063ec955b273d.png

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

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

二、二叉树练习题

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

3e79aed6a2734bbbba632a460333cf96.png

以上面这棵完全二叉树为例,度为1的节点只有1个


72150736f1b8469a9b51f531a9873fe0.png

以上面这棵完全二叉树的节点为例:度为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为完全二叉树最后一层中缺少的节点的个数)

缺少的节点是相对于满二叉树来说的。


3a295f1e84b1475e9305ac102807f4fe.png

x的最好情况和最坏情况如下:



24447ee9b86b4d348bcaf6d3b8d0ef68.png

当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题解法相同

直接画图分析:

aab2ffa7429e4f0f94633dea96f77293.png

总结

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

相关文章
|
1月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
48 12
|
1月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
46 10
|
1月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
49 2
|
2月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
3月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
128 4
|
3月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
148 16
|
3月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
209 8
|
3月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
328 9
|
3月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
53 1
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77

热门文章

最新文章