浅谈树形结构——特殊的树——二叉树

news2025/1/1 8:32:11

文章目录

  • 一、什么是二叉树?
  • 二、二叉树的特点
  • 三、二叉树的性质
  • 四、两种特殊的二叉树
    • 4.1、满二叉树
    • 4.2、完全二叉树
  • 五、一些关于二叉树特性的习题
  • 六、二叉树的存储[代码实现]
    • 6.1、链式存储
    • 6.2、顺序存储
  • 七、二叉树的遍历
    • 7.1、关于二叉树遍历的选择题练习

一、什么是二叉树?

二叉树是特殊的树。一棵二叉树是结点的有限集合:(1)、结点或者为空。(2)、或者由一个根结点加上两颗别称为左子树和右子树的二叉树组成。

二、二叉树的特点

(1)、二叉树的每个结点的度不能超过2(<=2)。
(2)、二叉树要求其每颗子树都必须为二叉树。
(3)、二叉树的子树有左右之分,左子树、右子树不能次序颠倒,二叉树是一颗有序树。
在这里插入图片描述

三、二叉树的性质

(1)、若规定根结点层数为1,则一颗非空二叉树的第i层上最多有 2^(i - 1) (i > 0)个结点。(即根据公式 2 ^ (i - 1) 就可以求出二叉树每层所含的结点个数)
推导过程
在这里插入图片描述

(2)、若规定只有根结点的二叉树的深度为1,则深度为k的二叉树所含的总结点个数为 2^k - 1(k >= 0)。
推导过程:
在这里插入图片描述

(3)、对任何一颗二叉树,如果其叶结点个数为 n0,度为2的非叶子结点个数为n2,则 n0 = n2 + 1。
推导过程:
在这里插入图片描述

(4)、具有n个结点的完全二叉树的深度k为log以2为底的(n+1)。
推导过程:
在这里插入图片描述

(5)、对于具有n个结点的完全二叉树,如果按照从上至下、从左至右的顺序对所有结点从0开始编号,则对于序号为i的结点有:
在这里插入图片描述

四、两种特殊的二叉树

4.1、满二叉树

满二叉树:一棵二叉树,如果每层的结点树都达到最大值2,则这颗二叉树就是满二叉树。也就是说,一棵二叉树的层数为k,那么这颗二叉树的总结点数为 (2^k)- 1,则他就是满二叉树。
在这里插入图片描述

4.2、完全二叉树

完全二叉树是效率很高的数据结构,是由满二叉树引出来的。对于深度为k,有n个节点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从0至n-1的结点— —对应时称之为完全二叉树。满二叉树是一种特殊的完全二叉树。
在这里插入图片描述

五、一些关于二叉树特性的习题

(1)、若一颗二叉树的结点数为399,度为2的非叶子结点n2有199个,叶子结点n0为()个。
A、100
B、200
C、300
D、120
由于公式 n0 = n2 + 1,因此 选B。

(2)、在2n个结点的完全二叉树中,叶子结点的个数为()。
A、n
B、n+1
C、n-1
D、n/2
在这里插入图片描述
(3)、一个具有 767 个结点的完全二叉树,其叶子结点个数为()。
A、383
B、384
C、385
D、386

在这里插入图片描述

(4)、一颗完全二叉树的结点数为 531 个,那么这棵树的高度为(B)。
A、11
B、10
C、8
D、12

在这里插入图片描述

六、二叉树的存储[代码实现]

二叉树的存储结构分为:线性存储和类似于链表的链式存储

6.1、链式存储

二叉树的链式存储是通过一个一个的结点引用起来的,常见的表示方法有二叉和三叉表示方式, 具体如下:

// 孩子表示法
class Node {
	int val; // 结点的值
	Node left;// 左孩子的引用,常常代表左孩子为根的整颗左子树
	Node right;// 右孩子的引用,常常代表右孩子为根的整颗右子树
}

// 孩子双亲表示法
class Node {
	int val; // 数据域
	Node left; // 左孩子的引用,常常代表左孩子为根的整棵左子树
	Node right; // 右孩子的引用,常常代表右孩子为根的整棵右子树
	Node parent; // 当前节点的根节点
}

采用 孩子表示法 构造 二叉树

前序遍历preOrder()的代码解析:
在这里插入图片描述

获取结点数size()的代码解析:
在这里插入图片描述

6.2、顺序存储

七、二叉树的遍历

二叉树 最重要的 基本功能 就是遍历,二叉树的遍历方式具有4种。

所谓 遍历(Traversal) 是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。

访问结点所做的操作依赖于具体的应用问题 (比如:打印节点内容、节点内容加1)。 遍历是二叉树上最重要的操作之一,是二叉树上进行其它运算的基础。遍历的方式有4种:

(1)、前序遍历
根 ——> 左子树 ——> 右子树

在这里插入图片描述

(2)、中序遍历
左子树 ——> 根 ——> 右子树

(3)、后序遍历
左子树——> 右子树 ——> 根

(4)、层序遍历
从左到右,遍历每一层。

根据前序 和 后序 能不能创建一颗二叉树。不能。为什么不能?

7.1、关于二叉树遍历的选择题练习

(1)、某完全二叉树按层次输出(同一层从左到右)的序列为 ABCDEFGH 。该完全二叉树的前序序列为()
A: ABDHECFG
B: ABCDEFGH
C: HDBEAFCG
D: HDEBFGCA
在这里插入图片描述

(2)、二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历:HFIEJKG.则二叉树根结点为()
A: E
B: F
C: G
D: H
在这里插入图片描述

(3)、设一课二叉树的中序遍历序列:badce,后序遍历序列:bdeca,则二叉树前序遍历序列为()
A: adbce
B: decab
C: debac
D: abcde
在这里插入图片描述
[!] 根据前序遍历、后序遍历 能否创建出一颗二叉树? 不能! 前序 和 后序 都只能确定根,不能确定根的左右子树!

(4)、某二叉树的后序遍历序列与中序遍历序列相同,均为 ABCDEF ,则按层次输出(同一层从左到右)的序列为()
A: FEDCBA
B: CBAFED
C: DEFCBA
D: ABCDEF
在这里插入图片描述

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

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

相关文章

Linux系统终端中文件权限的10位字符是什么意思

Linux操作系统终端长格式显示的文件 在Linux操作系统终端中用文件长格式命令ls -l显示文件&#xff0c;如上图。第一列10个字符表示的含义如下&#xff1a; drwxrwxrwx 第一个字符是表示该文件的类型&#xff0c;如红色d表示该文件是一个目录&#xff0c;详细内容可以参考我…

ROS 编程入门的介绍

2.1 创建 ROS 功能包 ROS&#xff08;Robot Operating System&#xff09;是一种开源的机器人软件框架&#xff0c;广泛用于机器人开发中。通过使用 ROS&#xff0c;开发者可以轻松创建和管理机器人应用程序。在本节中&#xff0c;我们将介绍如何创建一个 ROS 功能包并实现一些…

高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)

1. 安装 npm i amap/amap-jsapi-loader --save移步&#xff1a;官方文档 2. map组件封装 <script lang"ts" setup> import AMapLoader from amap/amap-jsapi-loader import { onMounted, ref } from vue import { propTypes } from /utils/propTypesdefineO…

【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅱ

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

以root用户登陆ubuntu的桌面环境

前言 在学习Linux的时候&#xff0c;经常都需要使用sudo权限来对配置文件进行修改&#xff0c;常用的方法就是用vim编辑器在命令行界面进行修改&#xff0c;比如sudo vim /etc/profile&#xff0c;但我觉得每次都用命令行挺麻烦的&#xff0c;于是&#xff01;&#x1f913;我…

【零散技术】Odoo17通过Controller下载PDF

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo作为一款开源ERP&#xff0c;拥有极佳的拓展性&#xff0c;Odoo的Controller框架也让它具备了作为微信小程序后端的能力&#xff0c;那么就存在 需要通过小程序来下载PDF的业务情况。 目录 1.功能代码 1.1 manifest 设置 …

neo4j 图数据库使用教程

文章目录 neo4j 图数据库使用教程1&#xff09; 下载2&#xff09;安装3&#xff09; 创建数据4&#xff09;查询数据5&#xff09; 更新数据6&#xff09; 建立索引 neo4j 图数据库使用教程 1&#xff09; 下载 neo4j下载地址 http://dist.neo4j.org/neo4j-community-3.5.2…

【C++前后缀分解】1888. 使二进制字符串字符交替的最少反转次数|2005

本文涉及知识点 C前后缀分解 LeetCode1888. 使二进制字符串字符交替的最少反转次数 给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次&#xff1a; 类型 1 &#xff1a;删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 &#xff1a;选择 字符…

redis群集三种模式:主从复制、哨兵、集群

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制…

合宙Air201模组LuatOS扩展功能:温湿度传感器篇!

通过前面几期的学习&#xff0c;同学们的学习热情越来越高。 合宙Air201模组除了支持3种定位方式外&#xff0c;还具有丰富的扩展功能&#xff0c;比如&#xff1a;通过外扩BTB链接方案&#xff0c;最多可支持21个IO接口&#xff1a;SPI、I2C、UART等多种接口全部支持。 本期…

【时时三省】(C语言基础)指针进阶 例题8

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 第一个打印2 a6不管它是多大 前面是&#xff1d;s 都得变成两个字节 所以打印2 第二个打印5 sizeof里面的表达式是不参与运算的 所以打印5 上面所有例题总结…

从边缘设备到云端平台,合宙DTURTU打造无缝物联网解决方案

如今&#xff0c;物联网&#xff08;IoT&#xff09;技术飞速发展&#xff0c;万物互联的时代已然到来&#xff0c;那么&#xff0c;高效、稳定地连接边缘设备与云端平台&#xff0c;实现数据的实时采集、传输与处理&#xff0c;就成为了推动物联网应用落地的关键。 DTU&#…

硬件工程师笔试面试——无线通讯模块

目录 15、无线通讯模块 15.1 基础 无线通讯模块实物图 15.1.1 概念 15.1.2 常见的无线通讯模块及其特点 15.1.3 无线通讯模块参数 15.1.4 无线通讯模块工作原理 15.2 相关问题 15.2.1 如何根据项目需求选择合适的无线通讯模块? 15.2.2 无线通讯模块的安全性如何,如…

合宙Air201模组LuatOS:点点鼠标就搞定的FOTA远程升级,你知道吗?

你是不是也经常遇到小伙伴吐槽&#xff1a;开发是个苦差事&#xff01;做项目倒还好&#xff0c;就怕遇到项目升级&#xff0c;那简直让人头大。。。 如果你也有这种困惑&#xff0c;就多了解一下合宙的开发工具&#xff0c;简单实用又高效&#xff0c;甚至只需点点鼠标&#…

【变化检测】基于ChangeStar建筑物(LEVIR-CD)变化检测实战及ONNX推理

主要内容如下&#xff1a; 1、LEVIR-CD数据集介绍及下载 2、运行环境安装 3、ChangeStar模型训练与预测 4、Onnx运行及可视化 运行环境&#xff1a;Python3.8&#xff0c;torch1.12.0cu113&#xff0c;onnxruntime-gpu1.12.0 likyoo变化检测源码&#xff1a;https://github.c…

【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题四

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

动手学深度学习(四)卷积神经网络-下

全连接层存在的问题&#xff1a;参数过大&#xff0c;计算成本过高。 一、网络中的网络&#xff08;NiN&#xff09; 1、NiN块 ①NiN块的结构 NiN串联多个由卷积层和“全连接”层构成的小网络来构建一个深层网络。这种由卷积层和“全连接”层构成的小网络就是NiN块。 &#…

线程池夺命十四问

目录 一&#xff1a;什么是线程池 二&#xff1a;线程池有什么好处 三&#xff1a;如何创建一个线程池 Executors ThreadPoolExecutors 四&#xff1a;创建一个线程池为什么不推荐使用Executors 五&#xff1a;如何设置线程池的大小 六&#xff1a;线程池有哪些参数 …

(CS231n课程笔记)深度学习之损失函数详解(SVM loss,Softmax,熵,交叉熵,KL散度)

学完了线性分类&#xff0c;我们要开始对预测结果进行评估&#xff0c;进而优化权重w&#xff0c;提高预测精度&#xff0c;这就要用到损失函数。 损失函数&#xff08;Loss Function&#xff09;是机器学习模型中的一个关键概念&#xff0c;用于衡量模型的预测结果与真实标签…

【数据结构篇】~链表算法题3(环形链表)

链表算法题3&#xff08;环形链表&#xff09; 环形链表的证明1. 环形链表I​1) 思路2&#xff09;代码实现 2. 环形链表II​1) 思路11) 思路22&#xff09;代码实现 环形链表的证明 1. 环形链表I​ https://leetcode.cn/problems/linked-list-cycle/description/ 1) 思路 判断…