数据结构与算法⑩(第四章_上)树和二叉树和堆的概念及结构(下)

简介: 数据结构与算法⑩(第四章_上)树和二叉树和堆的概念及结构

数据结构与算法⑩(第四章_上)树和二叉树和堆的概念及结构(上):https://developer.aliyun.com/article/1513412

2.3完全二叉树

定义:对于深度为h的,有 n个结点的二叉树,当且仅当其每一个结点都与深度为h的满二叉树中编号从 1 至 n的结点一一对应时称之为完全二叉树

前h-1层是满的,最后一层不满,但是最后一层从左到右是连续的。

完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。

所以,满二叉树是一种特殊的完全二叉树(每一层节点均为2)。

常识:

① 完全二叉树中,度为 1 的最多只有 1 个。

② 高度为 h的完全二叉树节点范围是

(如果不是满二叉树,最小个数就是倒数第一层(满二叉树)的高度算出的节点数+1(至少有一个),是满二叉树最大个数就是2^h - 1)

2.4二叉树的性质

四点规则:

① 若规定根节点的层数为 1 ,则一颗非空二叉树的第i层上最多有2^(i-1)个节点。

② 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h- 1.

(此时为满二叉树)(等比数列公式)

③ 任何一棵二叉树, 如果叶结点(度为0)个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2+1

(从只有一个结点(空树度也是0),逐个增加,就可以找到规律)

④ 若规定根节点的层数为1,具有N个结点的满二叉树的深度h=log(N+1)(log以2为底)。


2.4.1二叉树性质相关选择题:

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

A. 不存在这样的二叉树

B. 200

C. 198

D. 199

2.在具有 2n 个结点的完全二叉树中,叶子结点个数为( )

A. n

B. n+1

C. n-1

D. n/2

3.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )

A. 11

B. 10

C. 8

D. 12

4. 一个具有767个节点的完全二叉树,其叶子节点个数为()

A. 383

B. 384

C. 385

D. 386


答案解析:

1. n0=n2+1

2.假设叶子节点(度为0)有X个 则度为2的节点有x-1个,完全二叉树中度为1的节点为0个或1个

所以X+(X-1)+(0或1)=2n,所以叶子结点x个数为n

3.具有N个结点的满二叉树的深度h=log(N+1)(log以2为底)。

高度为 h的完全二叉树节点范围是


2的9次方= 512,2的10次方 - 1 = 1023 在范围内

4.同2 假设叶子节点有X个 则度为0的节点有x-1个,完全二叉树中度为1的节点为0个或1个

X+(X-1)+(0或1)=767 , x=383

1.B

2.A

3.B

4.A

2.5二叉树的顺序存储:

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆后面的章节会专门讲解。

二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

完全二叉树的顺序存储中

若父亲下标是i,则左孩子下标是2 * i + 1 右孩子下标是2 * i + 2

若孩子下标是i,则父亲下标是( i - 1)/2

像上面左图中C下标为2,左孩子F下标就为2 * 2 + 1=5,右孩子G下标为2 * 2 + 2=6,

D下标为3,E下标为4 则父亲B下标为(3 -1)/ 2 = 1 或者(4 -1)/ 2 = 1。

2.6二叉树的链式存储:

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。

通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,

左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。

链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,

后面学到高阶数据结构如红黑树等会用到三叉链。

 
// 二叉链
struct BinaryTreeNode
{
    struct BinTreeNode* pLeft;   // 指向当前节点左孩子
    struct BinTreeNode* pRight; // 指向当前节点右孩子
    BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
    struct BinTreeNode* pParent; // 指向当前节点的双亲
    struct BinTreeNode* pLeft;   // 指向当前节点左孩子
    struct BinTreeNode* pRight; // 指向当前节点右孩子
    BTDataType _data; // 当前节点值域
}

3.堆的概念及结构

【百度百科】堆(Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做 一棵完全二叉树的数组对象

完全二叉树的性质就是堆的性质,堆是完全二叉树的顺序结构存储。

① 堆总是一棵完全二叉树。

② 堆中的某个节点的值总是不大于或不小于其父节点的值。

堆的物理结构是数组,逻辑结构则是二叉树。

堆有多种,其中典型的是:大堆 和 小堆。

3.1小堆:

任意一个节点的两个子节点都比自己的值大或相等,也就是根最小,整个二叉树从上到下递增。

父亲位,比孩子位,要小


3.2大堆:

任意一个节点的两个子节点都比自己的值小或相等,也就是根最大,整个二叉树从上到下递减。

父亲位,比孩子位,要大


常考选择题:

解析:

题目只说明是堆,大堆小堆都可以。

一个个分析后发现除了A都不是

A差不多是这样:

               100

       60                 70

50                 32         65


3.3堆的作用

① 八大排序算法之一:堆排序

解决TopK问题,在N个数中找出最大的前K个或找出最小的K个......


4.树的笔试选择题

1.在用树表示的目录结构中,从根目录到任何数据文件,有( )通道

A.唯一一条

B.二条

C.三条

D.不一定


2.在一颗度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点有2个,则叶子结点有( )个

A.4

B.5

C.6

D.7

3.一颗拥有1000个结点的树度为4,则它的最小深度是( )

A.5

B.6

C.7

D.8


4.下列关于二叉树的叙述错误的是( )

A.二叉树指的是深度为 2 的树

B.一个 n 个结点的二叉树将拥有 n-1 条边

C.一颗深度为 h 的满二叉树拥有 2^h-1 个结点(根结点深度为1)

D.二叉树有二叉链和三叉链两种表示方式

5.一颗完全二叉树有1001个结点,其叶子结点的个数是( )

A.251

B.500

C.501

D.不能确定

6.在一颗完全二叉树中,某一个结点没有其左孩子,则该结点一定( )

A.是根结点

B.是叶结点

C.是分支结点

D.在倒数第二层

7.设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为( )个

A.11

B.12

C.13

D.14

8.下列关于树的叙述正确的是( )

A.树中可以有环

B.树的度是指所有结点中度最小的结点的度

C.树的深度指的是结点数最多的那一层的深度

D.树的根结点是所有结点的祖先结点

9.有n个元素的完全二叉树的深度是( )

A.nlogn

B.nlogn+1

C.logn

D.logn+1


答案及解析

(可以开两个网页对着题目看)

1.答案:A


解析:


树的特点是不相交,所以不可能有多个路径同时到达一个点。


2.答案:C


解析:


设度为i的节点个数为ni, 该树总共有n个节点,则n=n0+n1+n2+n3.


有n个节点的树的总边数为n-1条.


根据度的定义,总边数与度之间的关系为:n-1=0*n0+1*n1+2*n2+3*n3.


联立两个方程求解,可以得到n0 = n2 + 2n3 + 1, n0=6


3.答案:B


解析:


如果这棵树每一层都是满的,则它的深度最小,假设它为一个四叉树,高度为h,则这个数的节点个数为(4^h - 1) / 3,当h = 5, 最大节点数为341, 当h = 6, 最大节点数为1365,所以最小深度应该为6。


4.答案:A


解析:


A错误: 二叉树指最大孩子个数为2,即树的度为二的树。深度描述的为树的层数。


B正确: 对于任意的树都满足:边的条数比节点个数少1,因为每个节点都有双亲,但是根节点没有


C正确: 正确,参加二叉树性质


D正确: 二叉链一般指孩子表示法,三叉连指孩子双亲表示法,这两种方式是二叉树最常见的表示方式,虽然还有孩子兄弟表示法,该中表示方式本质也是二叉链


5.答案:C


解析:


该题需要用到二叉树性质:在任意二叉树中,度为0的节点都比度为2的节点多1个,即 n0 = n2 + 1


另外,在完全二叉树中,如果节点总个数为奇数,则没有度为1的节点,如果节点总个数为偶数,只有一个度为1的节点


因此:n0 + n1 + n2 = 1001 节点总数为奇数,没有度为1的节点


n0 + 0 + n2 = 2*n0-1 = 1001 n0 = 501


6.答案:B


解析:


完全二叉树中如果一个节点没有左孩子,则一定没有右孩子,必定为一个叶子节点,最后一层一定为叶子节点,但是倒数第二层也可能存在叶子节点。


7.答案:C


解析:


设Ni表示度为i的节点个数,则节点总数 N = N0 + N1 + N2


节点个数于节点边的关系: N个节点的树有N-1个边


边与度的关系:N - 1 = N1 + 2 * N2


故:N0 + N1 + N2 - 1 = N1 + 2 * N2


因此,得:N0 = N2 + 1


回到原题,N0 = 3,N1 = 8,可得N2 = 2。


因此答案是 3 + 8 + 2 = 13。


8.答案:D


解析:


A: 树中的节点不能相交


B: 树的度为所有节点中度最大的节点的度


C: 树的深度为根节点到叶子节点的最大深度


9.答案:D


解析:


参考完全二叉树的特性,高度h = log(n)向上取整 注意:底数是2

本篇完。

目录
相关文章
|
3月前
|
存储 监控 算法
基于 Go 语言跳表结构的局域网控制桌面软件进程管理算法研究
针对企业局域网控制桌面软件对海量进程实时监控的需求,本文提出基于跳表的高效管理方案。通过多级索引实现O(log n)的查询、插入与删除性能,结合Go语言实现并发安全的跳表结构,显著提升进程状态处理效率,适用于千级进程的毫秒级响应场景。
177 15
|
3月前
|
分布式计算 并行计算 算法
《数据之美》:图结构的精妙世界与算法实践
图是表示多对多关系的非线性数据结构,由顶点和边组成,可建模社交网络、路径导航等复杂系统。核心算法包括BFS/DFS遍历、Dijkstra最短路径、Floyd-Warshall全源最短路径,以及Prim和Kruskal最小生成树算法,广泛应用于推荐系统、社交分析与路径规划。
|
4月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
288 3
|
4月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
146 3
|
10月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
330 10
 算法系列之数据结构-二叉树
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
204 10
|
3月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
370 0
|
3月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
244 2
|
4月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
253 3
|
3月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
199 8

热门文章

最新文章