【数据结构】树和二叉树以及经典例题

news2025/8/3 4:14:44

目录

  • 1.树的基本概念
    • 1.1 树的特点
    • 1.2 树的一些相关概念
    • 1.3 树的表示
      • 1.3.1 那种结构表示树最优?(不是二叉树,就是普通的树)
    • 1.4 树在实际中的运用(表示文件系统的目录树结构)
  • 2. 二叉树(重点!!!)
    • 2.1 二叉树的概念
    • 2.2 特殊的二叉树
    • 2.3 完全二叉树的范围
    • 2.4 二叉树的性质
  • 3.例题
    • 3.1
    • 3.2
    • 3.3

1.树的基本概念

在认识数据结构里的“树”之前,我们先来看看现实生活中的树

在这里插入图片描述

我们现实生活中的树有什么特征?
有树根,有枝节,有叶子。
编程来源于生活,我们数据结构里的“树”也有这些特征。

在这里插入图片描述
概念如下:

树是一种非线性数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 ————百度百科

注意 “非线性” 这个词,表面了该数据结构是一对多或者多对多的关系

1.1 树的特点

1.有一个特殊的结点,称为根结点,根节点没有前驱结点(就是最上面的结点)
2.除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继

我们主要来看第二条:
“互不相交的集合”,就是结点之间不能有交集
如下图

在这里插入图片描述

其实,仔细观察的话,我们可以发现,这个说法还能换成:
树结构之间不能有回路

在这里插入图片描述

这几个点之间产生了回路,所以就不是树。
再来看看第二个特点:子树
就是,一颗大的树里面,包含了多个子树。
如图:

在这里插入图片描述

图中圈出来就是子树,这些子树还能被分为更小的子树。
再来刨析第二条特点:
每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
“前驱”“后继”是什么?
在上面树的逻辑图中   (仔细想想什么是逻辑图,后面会讲)
我们可以看到,除了第一层,和最后一层外,中间的结点都连了相应的结点
连接在上面的叫“前驱”,连接在下面的叫“后继”
根结点只有后继没有前驱,
最后一层的结点(也叫叶结点),只有前驱,没有后继
所以总结为:
 子树的根结点只有一个前驱,有0个或者多个后继

1.2 树的一些相关概念

在这里插入图片描述

概念挺多的,我们这里划分一下分为常用的和不常用的
常用的并且重要的:
节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推
树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
不常用的:
非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点
堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
森林:由m(m>0)棵互不相交的树的集合称为森林;(就是两棵或多棵互不相干的树)

1.3 树的表示

还记得我们上面提到的逻辑图吗?

在这里插入图片描述

这种能形象地表示数据结构的图,我们称为逻辑图。
比如链表,那种两个结点之间有箭头指向的图,以及我们上面这幅图都是逻辑图
其最大的特点就是,这种图是我们想象出来的,真实结构并不是这样的
所以在计算机里,我们还要利用更底层的数据结构实现它。
比如利用数组实现树,或者链表实现树

1.3.1 那种结构表示树最优?(不是二叉树,就是普通的树)

如果仅仅是一棵普普通通的二叉树,每个结点最多连两个结点,那么我们分别创建
左孩子指针和右孩子指针就能表示了。
但是,这里是树,也就是说一个结点可能连接两个以上的结点,
可能3个,4个,5个,6...
那我们可以利用“指针数组”去实现这么多的结点。
但是,有没有更好的方法?
同样只利用两个指针就可以一直表示下去?
思考一下
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
//孩子兄弟表示法
typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

在这里插入图片描述

有牛人发明了这种“孩子兄弟表示法”,能完美实现2个度以上的树
一个结点里存有 “孩子”和“兄弟”
“孩子“指向自己的下一个结点,没有”兄弟“就不用指向
”孩子“指向的结点,也有自己的”孩子“和”兄弟“,然后可以可以无限表示下去了。
仔细感受一下,牛人发明的这种方法,不得不佩服。

1.4 树在实际中的运用(表示文件系统的目录树结构)

在这里插入图片描述

2. 二叉树(重点!!!)

2.1 二叉树的概念

在这里插入图片描述

在这里插入图片描述

在上面学习了树以后,我们接下来看看二叉树
二叉树:由一个根节点加上两棵别称为左子树和右子树的二叉树组成

在这里插入图片描述

注意:
1. 二叉树不存在度大于2的结点
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

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

在这里插入图片描述

2.2 特殊的二叉树

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

记住这个层数为k时,结点总数是 2 k − 1 2^{k}-1 2k1,非常重要,后面需要用到

2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
简单理解完全二叉树就是,最后一层可以满,满了就是满二叉树。也可以不满,不满的话起码结点从左往右排好

在这里插入图片描述

2.3 完全二叉树的范围

因为满二叉树是一种的特殊的完全二叉树,所以完全二叉树的总结点最多是 2 k − 1 2^{k} -1 2k1,(k表示总层数)

那么最少是多少?
最少的话是不是最后一层只有一个结点
既然这样的话,那么最后一层的上一层总结点数是不是 2 k − 1 − 1 2^{k-1} -1 2k11
那么上一层是满的,再 +1 是不是就是最后一层加一个结点
答案就是:
2 k − 1 2^{k-1} 2k1

所以完全二叉树的总结点范围就是
2 k − 1 2^{k-1} 2k1 ~ 2 k − 1 2^{k} - 1 2k1 (k是总层数)

2.4 二叉树的性质

  1. 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2 ( i − 1 ) 2^{(i-1)} 2(i1)个结点. (注意这里是某一层上的最多结点)

  2. 若规定根节点的层数为1,则深度为h的二叉树的最大结点数 2 h − 1 2^{h}-1 2h1 (就是满二叉树)

  3. 对任何一棵二叉树, 如果度为0其叶结点个数为n0 , 度为2的分支结点个数为n2 ,则有 n0= n2 +1(度为0的结点永远比度为2的结点多1,这个结论也挺重要的,自己画图理解一下)

  4. 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2(n+1)

  5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
    5.1 若i>0i 位置节点的双亲序号(i-1)/2;i=0,i为根节点编号,无双亲节点
    5.2 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
    5.3 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

3.例题

光看性质是不是觉得很乱,我们来做几道题就明白了。

3.1

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

解答:
设该树共有n个结点,这是一棵度为3的树,
则 n = n0 + n1 + n2+n3 … …(1)
有n个结点的树的边有 n - 1 条
根据度的定义,总边数与度之间的关系为
n - 1 = n0* 0 + n1 * 1 + n2 * 2 + n3 * 3 … … (2)

(1)(2)式联立可得 n0=n2+2 * n3 + 1
叶子结点就是度为0的点
所以答案就是 n0 = 1 + 2 * 2 + 1 = 6

3.2

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

解答:
如果这棵树每一层都是满的,则它的深度最小,

n层k叉树的总结点个数 ( k n − 1 k^{n}-1 kn1) / (k - 1)
所以树的度为4,表示4叉树,
4 n − 1 4^{n}-1 4n1)/ 3
当n = 5,最大结点数为 341
当n = 6,最大结点数为 1365

所以最小深度为6

3.3

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

解答:
这里需要用到 二叉树的性质 3
n0 = n2 + 1,度为0的结点永远比度为2的结点多一个

这是一棵二叉树,度可能是0,1,2,分别用 n0,n1,n2表示

n= n0+n1+n2

另外,在完全二叉树中,如果节点总个数为奇数,则没有度为1的节点,如果节点总个数为偶数,只有一个度为1的节点。(自己画个图能推出来)
那么1001个结点,没有度为1的结点

所以 n = n0 + n0 - 1 = 1001
所以 n0 = 501
所以叶子结点就是 501

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

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

相关文章

嵌入式linux实现pppoe拨号上网

make menuconfig -> Device Drivers -> Network device support -> PPP (point-to-point protocol) 中&#xff0c;选中所有ppp选项。退出&#xff0c;保存配置&#xff0c;修改Makefile重新执行make zImage. 将arch/mips/boot/下的zImage下载到开发板上重启系统。 t…

oracle数据库的导入与导出

1、oracle数据库导入与导出需要注意 2、导出数据格式介绍 3、 传统方式exp(导出&#xff09;和&#xff08;imp&#xff09;导入 3.1 命令执行方式 3.2 命令格式 3.3 导出数据 3.3.1示例 3.4 导入数据 3.4.1 导入数据 4 使用PL/SQL Developer 实现数据导入与导出 4.1 导出与导…

文本分类微调技巧实战2.0

讯飞比赛答辩结束&#xff0c;笔者和小伙伴们参加了一些讯飞的比赛&#xff0c;今年讯飞文本分类比赛相比去年更加多元化&#xff0c;涉及领域、任务和数据呈现多样性&#xff0c;听完各位大佬的答辩之后&#xff0c;结合之前经验和以下赛题总结下文本分类比赛的实战思路。 1 …

allegro16.6导出版图到ADS2019仿真的方法

首先配置好allegro软件 1. 选择FILE->Script, 弹出窗口后选择Browse &#xff0c; 选择ADS对应文件夹下\Keysight\ADS2019\ial\scripts的描述文件&#xff0c;并勾选Change Directory 点击确认&#xff1b; 2.回到Scripting界面点击Replay &#xff1b; 在弹出的窗口红框位…

Au NPs/FA/PAMAM-DOX 金纳米粒子/叶酸/聚酰胺-胺型树枝状高分子修饰阿霉素的研究

下面小编要分享给大家的内容是Au NPs/FA/PAMAM-DOX 金纳米粒子/叶酸/聚酰胺-胺型树枝状高分子修饰阿霉素&#xff0c;和小编一起来看&#xff01; PAMAM-DOX 聚酰胺-胺型树枝状高分子修饰阿霉素制备方法&#xff1a; 采用逆向蒸发结合pH梯度法制备LLDs-PAMAM-DOX,观察形态,测定…

基于SpringBoot的体育场运营系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;采用HTML和Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Mav…

【QT知识】在widget中的绘制事件函数

在widget中的绘制事件函数 文章目录1. 代码实现头文件部分cpp文件部分2. 事件函数参考博客&#x1f60a;点此到文末惊喜↩︎ 1. 代码实现 头文件部分 #include <QWidget> #include <QPainter>namespace Ui { class widget_2_1; }class widget_2_1 : public QWid…

相控阵天线(四):阵列天线波束赋形(遗传算法、粒子群算法、进化差分算法)

目录波束赋形简介遗传算法波束赋形粒子群算法波束赋形差分进化算法波束赋形智能算法比较遗传算法波束赋形代码示例波束赋形简介 根据期望的方向图辐射特性(如方向图形状、主瓣宽度、副瓣电平、方向性系数)并以某种方法求得阵面电流分布并将此电流分布施加于相应通道中&#xf…

CCF CTO Club 16期活动记事——走进腾讯,实现连接

11月17日&#xff0c;有幸通过CCF CTO Club活动报名&#xff0c;参观了腾讯北京的总部&#xff0c;在腾讯总部大楼7层宴会厅尝到了美食&#xff0c;还参加了“云原生技术的探索与实践”专场讲座和讨论&#xff0c;味蕾和思维获得了双丰收。 参观腾讯总部 这次参观腾讯北京总部…

用 VS Code 搞 Qt6:信号、槽,以及QObject

用 VS Code 搞 Qt6&#xff1a;信号、槽&#xff0c;以及QObject Qt 里面的信号&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;虽然看着像事件&#xff0c;但它实际上是用来在两个对象之间进行通信的。既然是通信&#xff0c;就会有发送者和接收者。 1、信…

NodeJs实战-待办列表(3)-前端页面填充待办数据

NodeJs实战-待办列表3-前端页面填充待办数据为啥在前端填充待办数据&#xff1f;如何在前端填充待办数据&#xff1f;需要了解的知识页面修改后端服务封装数据返回server.js 修改效果图初始化页面添加待办事项完成待办事项为啥在前端填充待办数据&#xff1f; 第2节的页面数据…

Django基础学习

目录 1、Django MVT模型 2、Django项目和应用 2.1 项目和子应用的创建 2.2 子应用url路由配置 3、Django的templates配置 4、Django请求的处理 4.1 get请求处理 4.2 post请求处理 5、Django数据库操作 5.1、数据库连接配置 5.2、models.py配置 5.3、django数据库表的…

【node进阶】深度解析Koa框架---路由|静态资源|获取请求参数

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

创建自己的函数库

创建自己的函数库前言一、什么是STM32标准函数库1.定义&#xff1a;2.作用&#xff1a;3.对比&#xff1a;二、构建库函数1.修改寄存器地址封装2.定义访问的结构体指针和引脚3.创建封装函数3.1创建拉低引脚函数3.2创建引脚初始化函数总结前言 回顾一下&#xff0c;前面点亮led…

世界儿童日,周大福真诚关爱儿童成长

守护童心 呵护成长 周大福秉持着“用真诚让幸福永恒”的企业理念&#xff0c;百周年承诺“以人为本”。以爱和关怀凝聚社会力量&#xff0c;提倡社会共融&#xff0c;缔造可持续未来。 梦想家祝福 2021年周大福珠宝集团与美丽中国&#xff0c;携手打造“家源于此”项目。于2…

podman-compose 有前途吗?

文章目录1. 前言2. Docker Compose 和 Podman Compose 的历史3. 未来4. 观点5. 安装5.1 pip3 安装5.2 python 安装5.3 dnf 安装6. 示例1. 前言 虽然 Kubernetes 已经发展成为容器编排的主导者&#xff0c;但人们仍然对管理较小规模的容器&#xff08;通常是单个系统&#xff0…

centos7—安装mysql

文章目录1.1 卸载MariaDB1.2 官网下载包文件1.3 解压安装包1.4 安装相关的Mysql服务1.5 开启Mysql服务1.1 卸载MariaDB 由于centOS7中默认安装了MariaDB,需要先进行卸载 rpm -qa | grep -i mariadb #查找本地mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.aarch64 #这个…

nuxt 如何生成sitemap.xml 动静态站点地图

前言 sitemap.xml的作用是将我们网站的所有页面都被SEO&#xff08;浏览器搜索引擎&#xff09;收录&#xff0c;我们网站的内容更容易被用户搜到&#xff0c;同时增加我们的网站的知名度&#xff0c;排名更靠前。简言之就是用技术做网站推广&#xff0c;所以对于网站推广sitem…

JVM【类加载与GC垃圾回收机制】

JVM【类加载与GC垃圾回收机制】&#x1f34e;一.JVM&#x1f352;1.1JVM简介&#x1f352;1.2JVM执行流程&#x1f34e;二.JVM运行时数据区&#x1f352;2.1 程序计数器(线程私有)&#x1f352;2.2 栈(线程私有)&#x1f352;2.3 堆(线程共享)&#x1f352;2.4 方法区(线程共享…

Matlab图像处理基础(part 1)

目录 0. 概要 1. 图像表示 Image Representation 1.1 图像格式 Image format 1.2 图像分辨率 resolution of image 1.3 图像的编码 1.4 Matlab图像加载、显示和保存 1.5 Image Information 1.6 图像格式转换 1.7 其它类型的像素 1.8 像素数值格式 1.9 图像数据的访问…