【初阶数据结构】树和二叉树

news/2025/2/26 11:23:14

目录

  • 前言
  • 的概念与结构
  • 二叉的概念及结构
    • 二叉的概念
    • 几种特殊的二叉
      • 1.满二叉
      • 2.完全二叉
    • 二叉的性质
    • 二叉的存储结构
      • 1、顺序存储
      • 2、链式存储

请添加图片描述

前言

前面我们学习了顺序表,单链表,栈和队列,它们在逻辑上都是线性结构,从这节开始来学习非线性结构——

数据结构专题学习:数据结构学习
C++专题学习:深入学习C++

的概念与结构

的概念

是一种非线性的数据结构它是由n(n>=0)个有限节点组成一个具有层次关系的集合。
在这里插入图片描述
一棵如果一个节点都没有,那就叫做空
非空的性质:

  • 一棵有且仅有一个根节点,根节点没有前驱节点,如上面的A节点。
  • 当n > 1时(即中不止根节点),其余结点可分为m(m > 0)个互不相交的有限集合T1, T2,…, Tm,其中每个集合本身又是一棵,并且称为根结点的子

在这里插入图片描述
所以可以看做是“根节点+n棵子”组成,而每棵子又可看做是“根节点+n棵子”组成。所以是一种递归定义的数据结构

注意:在形结构中,子之间不能有交集,否则就不是形结构,而是图,如以下两个都不是
在这里插入图片描述

的相关概念

在这里插入图片描述

名词解释
节点的度一个节点含有孩子,或者是分支的个数,称为该节点的度,如上图,A节点的度为6。
叶子节点(终端节点)度为0的节点称为叶节点;如上图的B、C、H、I等
分支节点(非终端节点)度不为0的节点;如上图的D、E、F、G等
父节点(双亲节点)若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图的A是B的父节点
子节点一个节点含有的子的根节点称为该节点的子节点;如上图的B是A的子节点
兄弟节点具有相同父节点的子节点互称兄弟节点;如上图的B、C是兄弟节点
的度一棵中,最大的节点的度称为的度;如上图:的度为6
节点的层次从根开始,根为第一层,根的子节点为第二层,以此类推
的高度(深度)中节点的最大层次;如上图:的高度为4.
堂兄弟节点双亲在同一层的节点互为堂兄弟;如上图:H、I互为堂兄弟节点
路径长度路径上所经过边的个数
的路径长度从根到每个路径长度的总和
有序中节点的各子从左到右是有次序的,不能互换

中有一个重要的性质就是:节点数 = 总度数 + 1;

的表示

  由于是一种非线性结构,相对于线性表,存储表示起来就比较复杂了。既要保存当前结点的值,也要保存结点和结点之间的关系。实际中有很多种表示方式,例如:双亲表示法(结点的指针指向双亲),孩子表示法(结点的指针指向孩子)、孩子双亲表示法(二者混合)以及孩子兄弟表示法等。我们这里就简单的了解其中最常用的孩子兄弟表示法。

typedef int DataType;
struct Node
{
	struct Node* fristChild1;    //指向第一个孩子节点
	struct Node* pNextBrother;   //指向下一个兄弟节点
	DataType data;               //存放节点中的数据域
};

在这里插入图片描述

二叉的概念及结构

二叉的概念

二叉是n(n≥0)个节点的有限集合
①若为空二叉,则n=0。
②若为非空二叉,则由一个根结点和两个互不相交的被称为根的左子和右子组成。左子和右子又分别是一棵二叉(左,右子也可以是空二叉
在这里插入图片描述

二叉特点
①每个节点至多有两棵子
②左右子不能颠倒,因为二叉是有序

下面是二叉的五种形态:
在这里插入图片描述

几种特殊的二叉

1.满二叉

满二叉:一棵高度为h,且含有2h - 1个结点的二叉。也就是它的每一层的节点数都达到了最大值。

满二叉特点

  • 只有最后一层有叶子节点
  • 不存在度为1的节点
  • 按层序从1开始编号,节点i的左孩子为2i,有孩子为2i+1;节点i的父节点为i/2(默认i/2为计算机中直接取整,如:7/2 == 3)。

2.完全二叉

当且仅当其每个结点都与高度为h的满二叉中编号为1~n的结点一一对应时,称为完全二叉

完全二叉的特点:

  • 只有最后两层可能有叶子节点
  • 最多只有1个度为1的节点
  • 如果i≤n/2为分支节点,i大于n/2为叶子节点。

在这里插入图片描述

二叉的性质

  1. 设非空二叉中度为0、1和2的节点个数分别为n0、n1和n2。则n0=n2+1
  2. 非空二叉中,规定根节点为第一层,则第i层最多有2i-1个节点。
  3. 非空二叉中,规定根节点为第一层,高度为h的二叉最多有2h-1个节点。
  4. 非空二叉中,规定根节点为第一层,具有n个结点的满二叉的深度h=log2(n+1)。

二叉的存储结构

二叉的存储结构可以分为顺序存储链式存储

1、顺序存储

  顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉,因为如果不是完全二叉就会有空间的浪费。而现实中只有堆会用数组来存储(堆也是一种特殊的完全二叉)。二叉顺序存储在物理上是一个数组,在逻辑上是一棵二叉
在这里插入图片描述
定义一个长度为MaxSize的数组t,按照从上至下、从左至右的顺序依次存储完全二叉中的各个节点。
在这里插入图片描述

2、链式存储

  二叉的链式存储结构是指用链表来表示一棵二叉,即用链来表示元素的逻辑关系。通常的方法是链表中的每个节点由三个域组成,为数据域和左右指针域。左右指针分别用来给出该节点左孩子和右孩子所在的链节点的存储地址。链式结构又分为二叉链和三叉链,目前我们使用二叉链。
在这里插入图片描述
链式存储的表示如下:

typedef int BTDataType;
//二叉链
struct BinaryTreeNode
{
	struct BinaryTreeNode* left;   //指向当前节点的左孩子
	struct BinaryTreeNode* right;  //指向当前节点的右孩子
	BTDataType data;               //当前节点的值
}

//三叉链
struct BinaryTreeNode
{
	struct BinaryTreeNode* parent;   //指向当前节点的双亲
	struct BinaryTreeNode* left;   //指向当前节点的左孩子
	struct BinaryTreeNode* right;  //指向当前节点的右孩子
	BTDataType data;               //当前节点的值
}

感谢大家观看,如果大家喜欢,希望大家一键三连支持一下,如有表述不正确,也欢迎大家批评指正。
请添加图片描述


http://www.niftyadmin.cn/n/5868621.html

相关文章

kotlin 知识点 七 泛型的高级特性

对泛型进行实化 泛型实化这个功能对于绝大多数Java 程序员来讲是非常陌生的,因为Java 中完全没有这个概 念。而如果我们想要深刻地理解泛型实化,就要先解释一下Java 的泛型擦除机制才行。 在JDK 1.5之前,Java 是没有泛型功能的,…

C语言学习笔记-初阶(13)scanf介绍

当我们有了变量&#xff0c;我们需要给变量输入值就可以使用 scanf 函数&#xff0c;如果需要将变量的值输出在屏幕上的时候可以使用 printf 函数&#xff0c;下面看⼀个例子&#xff1a; #include <stdio.h> int main() {int score 0;printf("请输⼊成绩:")…

探索超声波的奥秘——定时器与PCA

超声波技术的诞生灵感来源于大自然中的回声定位现象&#xff0c;尤其是蝙蝠的独特能力。蝙蝠通过发出高频超声波并捕捉回声来精确地探测周围的物体和猎物&#xff0c;即使在漆黑的夜晚也能轻松导航。 在单片机中&#xff0c;也有着超声波这个模块&#xff0c;它在单片机上的标识…

[实现Rpc] 客户端 | Requestor | RpcCaller的设计实现

目录 Requestor类的实现 框架 完善 onResponse处理回复 完整代码 RpcCaller类的实现 1. 同步调用 call 2. 异步调用 call 3. 回调调用 call Requestor类的实现 &#xff08;1&#xff09;主要功能&#xff1a; 客户端发送请求的功能&#xff0c;进行请求描述对服务器…

IDEA关闭SpringBoot程序后仍然占用端口的排查与解决

IDEA关闭SpringBoot程序后仍然占用端口的排查与解决 问题描述 在使用 IntelliJ IDEA 开发 Spring Boot 应用时&#xff0c;有时即使关闭了应用&#xff0c;程序仍然占用端口&#xff08;例如&#xff1a;4001 端口&#xff09;。这会导致重新启动应用时出现端口被占用的错误&a…

Java进阶:Docker

1. Docker概述 1.1. Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言开发。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱…

Elasticsearch面试宝典【刷题系列】

文章目录 1、ES中的倒排索引是什么&#xff1f;2、ES是如何实现master选举的&#xff1f;3、如何解决ES集群的脑裂问题4、详细描述一下ES索引文档的过程&#xff1f;5、详细描述一下ES更新和删除文档的过程&#xff1f;6、详细描述一下ES搜索的过程&#xff1f;7、在并发情况下…

解析Excel表表头

常见的一级表头 表头通常位于Excel文件的第一行&#xff0c;包含了每一列的名称。在Excel文件中&#xff0c;第一行的单元格内容通常定义了每一列的字段名称&#xff0c;这些字段名称就是表头。 import pandas as pd# 加载Excel文件 file_path "Test.xlsx" # 替换…