[数据结构基础]树和二叉树的概念、结构及性质

news2024/12/23 22:16:23

目录

一. 树

1.1 树的概念及结构

1.2 树和树的节点的相关概念 

1.3 定义树的四种方式

1.3.1 说明了树的度为N

1.3.2 采用顺序表的方式存储子节点

1.3.3 采用结构体数组进行存储

1.3.4 左孩子右兄弟表示法(最优)

二. 二叉树

2.1 二叉树的概念及结构

2.2 两种特殊的二叉树

2.3 二叉树的性质 

2.4 二叉树的存储

2.4.1 顺序存储

2.4.2 链式存储 


一. 树

1.1 树的概念及结构

  • 树是一种非线性结构,它由n(n>=0)个有限节点组成一个具有层次关系的集合。把它叫做数是因为它的逻辑结构(见图1.1)像一颗倒挂的树,根朝上,叶朝下。
图1.1 数的结构示意图
  • 树有一个根节点,根节点没有前驱结点。
  • 除根节点外,其余节点被分为M(M>0)个互不相交的集合T1、T2、...、Tm,其中每一个集合Ti又是一颗与树类似的子树,每颗子树的根节点只有一个前驱,可以有多个后驱。
  • 任何树都可以被分为根和子树,详见图1.2。
图1.2 根节点和子树示意图

1.2 树和树的节点的相关概念 

  1. 节点的度:一个节点含有的子树的个数,如:图1.1中A节点的度为3。
  2. 叶子节点(终端节点):度为0的节点,如:图1.1中J、K、L为叶子节点。
  3. 分支节点(非终端节点):度不为0的节点。
  4. 父亲节点(双亲节点):若一个节点含有子节点,则这个节点为其子节点的父亲节点,如:图1.1中A为B、C、D的父亲节点。
  5. 子节点:一个节点含有的子树的根节点为该节点的子节点,如:图1.1中E、F为B的子节点。
  6. 兄弟节点:具有相同父节点的节点称为兄弟节点,如:图1.1中B、C、D互为兄弟节点。
  7. 树的度:一棵树中,最大节点的度称为树的度,如:图1.1所示树的度为3。
  8. 节点的层次:从根节点开始定义,根为第1层,根的子节点为第2层,以此类推。如:图1.1中节点A的层次为1,节点B的层次为2,节点J的层次为4。
  9. 树的高度(深度):树中节点的最大层次,如:图1.1中树的高度为4。
  10. 堂兄弟节点:父节点在同一层次的节点,如:图1.1中F、G互为堂兄弟节点。
  11. 子孙:以某节点为根的子树中任意节点都为该节点的子孙,如:图1.1中所有节点都为A的子孙。
  12. 节点的祖先:从根到该节点所经分支上的所有节点均为该节点的祖先,如:图1.1中A为所有节点的祖先,A、C、G均为K、L的祖先。
  13. 森林:由m(m>0)颗数构成的集合称为森林。

1.3 定义树的四种方式

1.3.1 说明了树的度为N

struct TreeNode

{

        int data;  //树节点存储的数据        

        struct TreeNode[N];   //数的子节点(子节点个数一定<=N)

}

问题:

  • 由于可能存在多个节点的度小于N,会造成空间浪费。
  • 可能不知道树的度是多少

1.3.2 采用顺序表的方式存储子节点

typedef struct TreeNode* SLDataType;   //顺序表存储树节点数据类型

typedef struct SeqList  //定义顺序表来存储子节点地址

{

        SLDataType* a;  //指向树的子节点的指针

        int sz;  //子节点个数

}SeqList;

struct TreeNode

{

        int data;  //节点数据

        SeqList s;  //存储子节点地址的顺序表

};

问题:结构相对复杂。

1.3.3 采用结构体数组进行存储

typedef struct TreeNode  //树的节点

{

        int parent;   //父亲节点在数组中的下标

        int data;  //节点中存储的数据

}TN;

TN tree[...] = {... ...};   //存储树节点结构体的数组

图1.3  结构体数组存储树的示意图

问题:

  • 结构相对复杂。
  • 只能找到一个节点的父亲节点,很难找到一个节点的子节点。 

1.3.4 左孩子右兄弟表示法(最优)

上述三种表示树结构的方法各有各的问题,左孩子右兄弟表示法是表示一般树形结构的最优方法。

typedef int DataType;

struct TreeNode

{

        struct TreeNode* _firstChild;   //指向其左侧第一个子节点

        struct TreeNode* _pnextBrother;   //指向其1右侧第一个兄弟节点

        DataType data;   

};

图1.4  左孩子右兄弟法表示数结构图解

二. 二叉树

2.1 二叉树的概念及结构

一颗二叉树是节点的一个有限集合,该集合:

  1. 可能为空。
  2. 由一个根节点加上两颗分别称为左子树和右子树的二叉树组成。

通俗理解,二叉树就是度最大为2的树,二叉树的典型结构图见图2.1。

图2.1 典型的二叉树结构

二叉树有以下结构特点:

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

2.2 两种特殊的二叉树

满二叉树

  • 如果一个二叉树每层的节点数都达到了最大值(除了最后一层节点外,所有节点的度均为2),那么它就是满二叉树.满二叉树所有叶子节点都在最后一层,所有分支节点都有两个子节点。
  • 如果一个二叉树的层数为k,节点数为2^{k}-1,那么它就是满二叉树。

完全二叉树

  • 完全二叉树是从满二叉树中延伸出来的,是一种效率很高的数据结构。
  • 完全二叉树的前N-1层节点数均达到了最大值,最后一层可能不满,但从左到右是连续的。
  • 满二叉树是一种特殊的完全二叉树。
图2.2  满二叉树和完全二叉树的典型结构图

2.3 二叉树的性质 

  1. 若规定根节点的层数为1,那么一颗非空二叉树第i层的节点数为2^{i-1}
  2. 高度为h的二叉树含有的最大节点数为2^h-1
  3. 对于任何一颗二叉树,若度为0的节点数为N_{0},度为2的节点个数为N_2,有:N_0=N_2+1
  4. 具有n个节点的满二叉树的深度为:h=log_{2}(n+1)

2.4 二叉树的存储

二叉树的存储有两种方式:顺序存储和链式存储

2.4.1 顺序存储

二叉树的顺序存储即使用数组来存储,一般只适用于完全二叉树。对于非完全二叉树,也可以使用顺序存储,但这会造成空间浪费。

图2.3  完全二叉树的顺序存储示意图

 

图2.4 非完全二叉树的顺序存储示意图

特性:

  • 假设parent是数组中父亲节点的下标,则其左孩子节点和右孩子节点在数组中的下标可以表示为:leftchild = 2 × parent + 1、rightchild = 2 × parent + 2。
  • 无论左孩子节点还是右孩子节点,若某个节点的有父亲节点,则:parent = (child - 1) / 2。

2.4.2 链式存储 

  • 用链式结构存储二叉树可分为二叉链表存储和三叉链表存储。
  • 二叉链表包含两个指针,分别指向左孩子节点和右孩子节点。
  • 三叉链表包含三个指针,分别指向左孩子节点、父亲节点和右孩子节点。
图2.5  二叉链表和三叉链表存储二叉树示意图

 

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

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

相关文章

完爆90%的性能毛病,数据库优化八大通用绝招

毫不夸张的说咱们后端工程师&#xff0c;无论在哪家公司&#xff0c;呆在哪个团队&#xff0c;做哪个系统&#xff0c;遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论&#xff0c;能让大家快速、准确的去选择出合适的优化方案&#xff0c;我相信…

9.JS-作用域-预解析

1.作用域 代码名字&#xff08;变量&#xff09;在某个范围内起作用和效果&#xff0c;目的是为了提高程序的可靠性&#xff0c;减少命名冲突 2.js作用域的分类&#xff08;es6之前&#xff09; 全局作用域和局部作用域 全局作用域&#xff1a;整个script标签或者是一个单独…

【数据结构与算法——C语言版】2. 数组

前言 本篇文章介绍了数组的基础定义及使用&#xff0c;并针对数组的基本增删改查做了一些代码示例&#xff0c;下篇文章将讲解基于数组的更高效的方法&#xff0c;比如二分查找、插入排序等。 数组基础 数组定义 int nums[10] {0};如上&#xff0c;定义一个int类型的数组&…

【Python百日进阶-数据分析】Day146 - plotly小提琴图:px.violin()/go.violin()

文章目录四、实例4.1 Plotly Express 的小提琴图4.1.1 Plotly Express 的基本小提琴图4.1.2 带框和数据点的小提琴图4.1.3 多个小提琴图4.1.4 叠加的小提琴图4.2 graph_objects的小提琴图4.2.1 基本小提琴图4.2.2 多条小提琴迹线4.2.3 分组小提琴图4.2.4 分裂小提琴图4.2.5 高级…

植物大战僵尸:寻找召唤僵尸关键CALL

通过遍历寻找召唤僵尸的CALL&#xff0c;通过调用CALL出现自定义的僵尸&#xff0c;加速僵尸的出现。我们可以通过僵尸出现在屏幕中的个数来遍历寻找僵尸出现的CALL 僵尸CALL的遍历技巧&#xff1a;首先打开CE->进入游戏开始新的游戏-> 直接搜索未知初始化数据等待出现第…

新手程序员入职新公司,该如何快速上手?

小C今天又来找我了&#xff0c;一脸不开心的样子&#xff0c;我心想不是刚被开除&#xff0c;不会这么快又被开除了吧。 小C对我说&#xff1a;下周马上要入职新公司了。 我&#xff1a;好事啊&#xff0c;怎么一脸不开心的。 小C&#xff1a;马上要入职新公司了&#xff0c…

Altium Designer 20 凡亿教育视频学习-04-2

屏蔽电源线或者我们想要屏蔽的线&#xff0c;只显示我们想要的线 PCB上都是线会妨碍我们布线&#xff0c;因此在分模块的布置器件时&#xff0c;我们只单纯的显示我们需要的模块线&#xff0c;其他的线路就不显示了。白线叫预拉线&#xff0c;就是你真实的线要连的两个地方 第…

15nm粒径球形纳米金AuNPs-Thrombin修饰R-藻红蛋白/阿霉素的制备过程

15nm粒径球形纳米金AuNPs-Thrombin修饰R-藻红蛋白/阿霉素的制备过程 今天小编分享纳米金对于R-藻红蛋白的反应&#xff0c;一起看看吧&#xff1a; 纳米金修饰藻红蛋白的制备过程&#xff1a; 取不同pH条件下金前驱体溶液20 mL&#xff0c;先加入质量分数为2%的稳定剂(PVP&am…

高校房产管理系统使用环境?

数图互通高校房产综合管理信息系统是基于公司自主研发的FMCenterV5.0平台&#xff0c;是针对中国高校房产的管理特点和管理要求&#xff0c;研发的一套标准产品&#xff1b;通过在中国100多所高校的成功实施和迭代&#xff0c;形成了一套成熟、完善、全生命周期的房屋资源管理解…

redis 持久化

文章目录一、什么是redis持久化二、两种持久化机制三、RDB(Redis DataBase) 内存快照RDB 原理RDB的触发方式RDB的数据恢复&#xff1a;RDB的优点RDB的缺点四、AOF(Append Only File) 增量日志AOF 原理AOF的触发方式AOF 重写机制AOF的优点AOF的缺点一、什么是redis持久化 redis…

JavaEE【Spring】:SpringBoot 统一功能处理

文章目录前言一、用户登录权限效验1、最初用户登录验证2、Spring AOP 用户统⼀登录验证的问题3、Spring 拦截器① 自定义拦截器② 将自定义拦截器加入到系统配置4、拦截器实现原理① 实现原理源码分析② 拦截器小结5、扩展&#xff1a;统⼀访问前缀添加二、统⼀异常处理1、使用…

系分 - (软件)需求工程

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录系分 - (软件)需求工程考点摘要需求工程需求开发&#xff08;主线&#xff0c;目标&#xff09;需求分类领域工程PIECES框架需求获取需求记录技术需求分析结构化分析方法 - SASA - 数据字典SA - 数据流图D…

浅谈Web缓存

Web缓存分为两类 http缓存浏览器缓存 1、缓存位置 Service WorkerMemory CacheDisk CachePush Cache 2、浏览器缓存分为三类 cookielocalStroragesessionStorage cookie的最大容量为4kb, localStorage, sessionStorage容量为5M localStorage可永久存储, 除非调用API删除或…

【Linux编译器-gcc/g++使用】

1. 背景知识1. 预处理&#xff08;)2. 编译&#xff08;)3. 汇编&#xff08;&#xff09;4. 连接&#xff08;)有关具体详解可以参照这篇博客&#xff1a;程序环境与预处理2. gcc如何完成格式 gcc [选项] 要编译的文件 [选项] [目标文件]2.1预处理&#x1f4d9;功能&#x1f4…

11_1、Java集合概述

一、Java集合框架概述 一方面&#xff0c; 面向对象语言对事物的体现都是以对象的形式&#xff0c;为了方便对多个对象 的操作&#xff0c;就要对对象进行存储。另一方面&#xff0c;使用Array存储对象方面具有一些弊 端&#xff0c;而Java 集合就像一种容器&#xff0c;可以动…

【自学Java】Java语言数组赋值

Java语言数组赋值 Java数组赋值教程 在 Java 语言 中&#xff0c;给 数组 赋值&#xff0c;就相当于给每个位置上的对应的位置填充数据。 Java语言数组赋值详解 Java 中的数据赋值分为动态化赋值和静态化赋值两种赋值方式。动态化赋值指的是先定义数组&#xff0c;然后指定…

Unity github发布 和 gitignore文件的详细设置

你做了一个unity项目 想给他提到github上去 如果你是windows 他会不停提示你 warning: LF will be replaced by CRLF in ***** The file will have its original line endings in your working directory 提示这个是因为 windows和其他平台的换行符不一样导致的 git想给你改换行…

PDF转换成Word转换器,这个软件实在太好用了!

在办公中我们会发现&#xff0c;我们每天需要处理的文件实在是太多了。大部分时间里我们都在跟各种各样的文件打交道&#xff0c;有部分文件内容很接近&#xff0c;甚至只是转换了输出格式而已&#xff0c;其具体内容并没有发生改动。那当我们想要直接使用它的另一种格式的时候…

ArcGIS三维制作步骤发布时间:

ArcGIS三维制作步骤发布时间&#xff1a;2018-01-17 版权&#xff1a;同步视频教程&#xff08;一)&#xff1a;http://www.bigemap.com/video/play2018022687.html&#xff08;二&#xff09;&#xff1a;http://www.bigemap.com/video/play2018022686.html&#xff08;三&…

电脑死机怎么办?超级简单的方法

当我们的电脑运行多个软件的时候&#xff0c;就会很容易发生死机。如果是台式电脑&#xff0c;我们可以通过按重启按钮&#xff0c;或者是通过直接拔电源来解决死机的问题。 如果是笔记本电脑&#xff0c;我们怎么按鼠标或者电脑的键盘&#xff0c;它都没有反应。电脑死机怎么…