数据结构从入门到精通——树和二叉树

树和二叉树

  • 前言
  • 一、树概念及结构
    • 1.1树的概念
    • 1.2 树的相关概念(重要)
    • 1.3 树的表示
    • 1.4 树在实际中的运用(表示文件系统的目录树结构)
  • 二、二叉树概念及结构
    • 2.1二叉树概念
    • 2.2现实中的二叉树
    • 2.3 特殊的二叉树
    • 2.4 二叉树的性质
    • 2.5 二叉树的存储结构
  • 三、树和二叉树的练习题
    • 答案


前言

树和二叉树是计算机科学中常用的数据结构,它们在数据存储、搜索、排序等多个领域都有着广泛的应用。从简单的二叉树出发,我们可以逐步理解更复杂的树结构,如红黑树、AVL树等。

二叉树是一种每个节点最多有两个子节点的树结构,通常子节点被称为“左子节点”和“右子节点”。这种结构使得二叉树在编程中非常易于实现和操作。例如,我们可以使用数组或链表来存储二叉树,并通过递归算法来实现遍历、查找和插入等操作。

然而,二叉树并不是唯一的树结构。在实际应用中,我们可能需要处理更复杂的树形结构,如多叉树和森林等。多叉树是指每个节点可以有多个子节点的树结构,而森林则是由多个不相交的树组成的集合。这些树形结构在处理实际问题时,往往能够提供更好的解决方案。

除了上述的树形结构外,还有一些特殊的树形结构,如堆、并查集、字典树等。堆是一种特殊的完全二叉树,它可以用于实现优先队列等数据结构;并查集则是一种用于处理不相交集合合并及查询问题的数据结构;字典树则是一种用于快速查找字符串的数据结构。

总的来说,树形结构是一种非常有用的数据结构,它们在计算机科学中扮演着重要的角色。通过深入理解树和二叉树的基本原理和应用场景,我们可以更好地应用它们来解决实际问题,提高程序的效率和可靠性。因此,对于学习计算机科学的人来说,掌握树形结构是非常重要的。


一、树概念及结构

1.1树的概念

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

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

在这里插入图片描述
在这里插入图片描述

注意:树形结构中,子树之间不能有交集,否则就不是树形结构

在这里插入图片描述

1.2 树的相关概念(重要)

在这里插入图片描述

  • 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6

  • 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点

  • 非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G…等节点为分支节点

  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点

  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点

  • 兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

  • 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6

  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;这只是一般的认知,有些书上也会将第一层看作0,具体按题目来分析。一般题目不说都是按1来看

  • 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

  • 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点

  • 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

  • 森林:由m(m>0)棵互不相交的树的集合称为森林;

1.3 树的表示

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

typedef int DataType;
struct Node
{
	 struct Node* _firstChild1; // 第一个孩子结点
	 struct Node* _pNextBrother; // 指向其下一个兄弟结点
	 DataType _data; // 结点中的数据域
};

在这里插入图片描述

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

在这里插入图片描述

二、二叉树概念及结构

2.1二叉树概念

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

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

在这里插入图片描述
从上图可以看出:

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

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

在这里插入图片描述

2.2现实中的二叉树

在这里插入图片描述

在这里插入图片描述

2.3 特殊的二叉树

  1. 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2k - 1 ,则它就是满二叉树。
  2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

在这里插入图片描述

2.4 二叉树的性质

  • 若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2i-1 个结点.在这里插入图片描述

  • 若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2h - 1 .在这里插入图片描述

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

  • 若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2 (n + 1 ) (ps:log2 (n + 1 ) 是log以2为底,n+1为对数)

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

    • 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
    • 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
    • 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子

2.5 二叉树的存储结构

二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。

  1. 顺序存储
    顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我会在后面的文章进行讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
    在这里插入图片描述

  2. 链式存储
    二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,等学到高阶数据结构如红黑树等会用到三叉链。

在这里插入图片描述
在这里插入图片描述

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
	struct BinTreeNode* _pLeft; // 指向当前节点左孩子
	struct BinTreeNode* _pRight; // 指向当前节点右孩子
	BTDataType _data; // 当前节点值域
}
 
// 三叉链
struct BinaryTreeNode
{
 	struct BinTreeNode* _pParent; // 指向当前节点的双亲
 	struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 	struct BinTreeNode* _pRight; // 指向当前节点右孩子
 	BTDataType _data; // 当前节点值域
}

三、树和二叉树的练习题

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

  2. 下列数据结构中,不适合采用顺序存储结构的是( )
    A 、非完全二叉树
    B 、堆
    C 、队列
    D 、栈

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

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

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

答案

1.B
2.A
3.A 按1来排序,左子树的值是其根的2倍,右子树是2倍加1,故没有右子树 根据 n0 = n2 + 1 且少一颗右子树 即n1 = 1 2n2 + 2 = 2n n2 = n - 1 n0 = n

在这里插入图片描述
4.B
5.B (767 - 1)/ 2 + 1


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PCB差分通孔的数值建模方法

目录 0 引言 1 基于CST的3D通孔模型 2 通孔模型的近似等效计算 3 利用ADS进行电路仿真分析 4 总结 0 引言 当数据速率超过10Gbps时&#xff0c;PCB上的通孔所带来的寄生参数会成为影响数据误码率的关键因素之一&#xff0c;虽然通过三维电磁场求解器提取过孔的行为模型&…

rust入门(1)创建项目

安装 vscode 安装插件 rust-analyzerNative Debug vscode 配置自动格式化代码 settings.json{"editor.defaultFoldingRangeProvider": null,"[rust]": {"editor.defaultFormatter": "rust-lang.rust-analyzer", // Makes the magi…

Python 井字棋游戏

井字棋是一种在3 * 3格子上进行的连珠游戏&#xff0c;又称井字游戏。井字棋的游戏有两名玩家&#xff0c;其中一个玩家画圈&#xff0c;另一个玩家画叉&#xff0c;轮流在3 * 3格子上画上自己的符号&#xff0c;最先在横向、纵向、或斜线方向连成一条线的人为胜利方。如图1所示…

静态时序分析:SDC约束命令set_output_delay详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 目录 指定延迟值 指定端口、引脚列表 指定参考时钟 简单使用 指定时钟下降沿 指定参考端口、引脚 包含源、网络延迟 指定电平敏感 指定上升、下降沿 指…

Redux Toolkit

本文作者为 360 奇舞团前端开发工程师 阅读本文章前&#xff0c;需要先了解下 redux 的基本概念与用法&#xff0c;Redux Toolkit 是建立在 Redux 基础之上的工具包&#xff0c;因此需要对 Redux 的基本概念有一定的了解&#xff0c;包括 Action、Reducer、Store、Middleware 等…

C#四部曲(知识补充)

Unity跨平台原理 .Net相关 只要编写的时候遵循.NET的这些规则&#xff0c;就能在.NET平台下通用 各种源码→根据.NET规范编写→(虚拟机)生成CIL中间码(保存在程序集中)→转成操作系统原代码 跨语言← 跨平台↓ Unity跨平台原理&#xff08;Mono&#xff09; c#脚本→MonoC#编…

低压线性恒流LED恒流驱动芯片SM15633EH:用于洗墙灯和线条灯

洗墙灯和线条灯是两种常见的LED照明产品&#xff0c;它们都需要使用LED恒流驱动芯片来确保稳定、可靠的电流供应&#xff0c;从而保证LED的使用寿命和亮度。 对于洗墙灯而言&#xff0c;由于其发出的光线需要覆盖较大的区域&#xff0c;因此需要使用较大功率的LED芯片&#xf…

Linux操作系统与Windows文件互传(FTP)

一、开启Ubuntu下的FTP服务 打开Ubuntu的终端窗口&#xff0c;然后执行如下命令来安装 FTP服务。 sudo apt-get install vsftpd等待软件安装完成后&#xff0c;用输入以下命令打开vsftpd.conf文件 sudo vim /etc/vsftpd.conf 找到下图的两个使能语句改成如图即可(记住保存后再…

新版哥白尼系统快速下载哨兵数据

在新版哥白尼系统下载数据,总是failed或者速度很慢,如何实现MB/s的下载速度,只需要四步就可以解决: 1 登录系统,找到想下载的数据,点开product info按扭,​​​​​​ 2. 找到数据的Product id和Name, #Product id:https://zipper.dataspace.copernicus.eu/odata/v1/P…

Selenium操作浏览器,弹出文件选择框,实现自动选定“目标文件”

前言 本文是该专栏的第20篇,后面会持续分享python爬虫干货知识,记得关注。 我们在使用selenium操作目标页面的时候,可能会遇到如下图所示的情景。 在用selenium操作并点击页面元素的时候,会弹出一个文件选择框,需要我们选择目标文件,并点击确认按钮,目标文件才能上传成…

Stream-JDK8

Stream概念 代码示例 package com.zz.stream;import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors;/*** 使用Stream流* 找出姓张并且是三个字的名字*/ public class Test {public static void main(Stri…

cesiumlab白模效果一

效果 步骤 1、准备shp面数据 2、打开cesiumlab软件转换 选择shp面数据 设置高度&#xff0c;如果shp面中有高度字段&#xff0c;可以用高度字段&#xff0c;如果没有&#xff0c;可以用固定高度 设置贴图&#xff0c;这边用的是第二张效果&#xff0c;当然也可以用自己的贴图…

‘UnityEngine.Application‘ does not contain a definition for isBatchMode

unity 2017.4.37f1. 解决办法: Try to replace Application.isBatchMode with UnityEditorInternal.InternalEditorUtility.inBatchMode

MySQL实战:问题排查与监控

常见问题 有更合适的索引不走&#xff0c;怎么办&#xff1f; MySQL在选取索引时&#xff0c;会参考索引的基数&#xff0c;基数是MySQL估算的&#xff0c;反映这个字段有多少种取值&#xff0c;估算的策略为选取几个页算出取值的平均值&#xff0c;再乘以页数&#xff0c;即…

AI新工具(20240312) Midjourney官方发布角色一致性功能;免费且开源的简历制作工具;精确克隆语调、控制声音风格

1: Midjourney角色一致性功能 使人物画像在多方面高度一致成为可能。 Midjourney的角色一致性功能的使用方法如下&#xff1a; ⭐在你的输入指令后面加上 --cref URL&#xff0c;其中URL是你选择的角色图像的链接。 ⭐你可以通过 --cw 参数来调整参照的强度&#xff0c;范围…

Selenium控制已运行的Edge和Chrome浏览器(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令&#xff08;1&#xff09;Edge&#xff08;2&#xff09;Chrome 2. 执行python代码&#xff08;1&#xff09;先启动浏览器后执行代码&#xff08;2&#xff09;通过代码启动浏览器 3. 爬取效果3. 完整代码共享3.1 包含Excel部分的…

旅游景区公共广播 园区广播 公路服务区广播

旅游景区公共广播 园区广播 公路服务区广播 旅游景区公共广播 旅游景区公共广播(又称背景音乐)简称BGM&#xff0c;它的主要作用是掩盖噪声并创造一种轻松和谐的气氛&#xff0c;是一种创造轻松愉快环境气氛的音乐。掩盖环境噪声&#xff0c;创造与旅游景区相适应的气氛&#…

ubuntu20.04上获取Livox Avia雷达点云数据

若拿到手的Livox Avia激光雷达不知道它的ip信息&#xff0c;可以在官网上LiDAR Sensors - Livox下载上位机软件Livox Viewer&#xff0c;查看IP&#xff0c;下载window版本就可以。雷达通过网线连上电脑后&#xff0c;该软件就可以自动识别出来。按照下图步骤&#xff0c;就可以…

自动化运维工具---------------ANSIBLE

一、Ansible 发展史及功能 作者&#xff1a;Michael DeHaan&#xff08; Cobbler pxe kikstar 与 Func 作者&#xff09;ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具&#xff0c;使用它可以在相距数光年的距离&#xff0c;远程实时控制前线的舰队战斗2…

遥感云计算的一个拐点

GeoForge&#xff0c;一个值得关注的遥感大数据应用 简介 GeoForge是由Ageospatial公司开发的一个基于大语言模型(GeoLLMs)的地理空间分析平台。GeoForg的目的是使每个人都可以轻松进行地图绘制和地理空间分析&#xff0c;无论您是外行还是专家。 Geo for ChatGPT 作者团队已…