【初阶数据结构】树和二叉树
目录
- 前言
- 树的概念与结构
- 树的概念
- 树的相关概念
- 树的表示
- 二叉树的概念及结构
- 二叉树的概念
- 几种特殊的二叉树
- 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为叶子节点。

二叉树的性质
- 设非空二叉树中度为0、1和2的节点个数分别为n0、n1和n2。则n0=n2+1。
- 非空二叉树中,规定根节点为第一层,则第i层最多有2i-1个节点。
- 非空二叉树中,规定根节点为第一层,高度为h的二叉树最多有2h-1个节点。
- 非空二叉树中,规定根节点为第一层,具有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; //当前节点的值
}
感谢大家观看,如果大家喜欢,希望大家一键三连支持一下,如有表述不正确,也欢迎大家批评指正。

相关文章:
【初阶数据结构】树和二叉树
目录 前言树的概念与结构树的概念树的相关概念树的表示 二叉树的概念及结构二叉树的概念几种特殊的二叉树1.满二叉树2.完全二叉树 二叉树的性质二叉树的存储结构1、顺序存储2、链式存储 前言 前面我们学习了顺序表,单链表,栈和队列,它们在逻…...
【中等】59.螺旋矩阵Ⅱ
题目描述 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2: 输入:n…...
Spring Boot + Vue 接入腾讯云人脸识别API(SDK版本3.1.830)
一、需求分析 这次是基于一个Spring Boot Vue的在线考试系统进行二次开发,添加人脸识别功能以防止学生替考。其他有对应场景的也可按需接入API,方法大同小异。 主要有以下两个步骤: 人脸录入:将某个角色(如学生&…...
测试工程师玩转DeepSeek之Prompt
以下是测试工程师使用DeepSeek的必知必会提示词指南,分为核心场景和高效技巧两大维度: 一、基础操作提示模板 1. 测试用例生成 "作为[金融系统/物联网设备/云服务]测试专家,请为[具体功能模块]设计测试用例,要求࿱…...
虚中断理解
虚中断(Virtual Interrupt)是指在计算机系统中,特别是在虚拟化环境下,虚拟机或虚拟操作系统中使用的一种中断机制。它允许虚拟机监控程序(Hypervisor)或虚拟化管理程序在虚拟机之间进行中断处理和资源管理。…...
PC端-发票真伪查验系统-Node.js全国发票查询接口
在现代企业的财务管理中,发票真伪的验证至关重要。随着电子发票的普及,假发票问题日益严峻,如何高效、准确的对发票进行真伪查验,已经成为各类企业在日常运营中必须解决的关键问题。翔云发票查验接口做企业财务管理、税务合规的好…...
给Python加入自己的函数
在日常研究中,我们有时候会写一些Python没有的,但是很多个脚本都需要用的函数,反复的复制函数太过麻烦,我们可以进行一些简单的操作来变成一个可以直接import的函数 1. 首先我们新建一个.py文件,把我们的函数放进去&a…...
JAVA中包装类和泛型 通配符
目录 1. 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和封箱 1.3 自动自动装箱和封箱 2. 什么是泛型 3. 引出泛型 3.1 语法 4. 泛型类的使⽤ 4.1 语法 4.2 ⽰例 4.3 类型推导(Type Inference) 5 泛型的上界 5.1 语法 6. 通配符 6.1 通配符解决什么问题 6.2…...
Qt TCP服务端和客户端程序
1、服务端程序 利用QtCreator新建QMainWindow或QWidget工程,绘制UI如下所示。 mainwindow.h代码如下: #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> #include <QTcpSocket> #include &l…...
level2Day5
Makefile make是工程管理器 先写了1个f1.c里面写了一个函数 然后f2.c里面也写了一个函数 还有一个头节点 又写了一个makefile的函数 输入make编译,但是我没装make需要装一下。 sudo apt install make 然后make, Makefile变量的使用 通过赋值ÿ…...
青少年学习编程如何平衡使用DeepSeek与独立思考
前言 对于正在学习编程的青少年来说,DeepSeek生成代码的功能是一把双刃剑。如果合理使用,它可以成为青少年学习编程的有力助手;但如果过度依赖,可能会阻碍他们的思维发展和能力提升。关键在于引导青少年正确看待工具的作用&#…...
MySQL 8.0 Enterprise Backup (MEB) 备份与恢复实践指南
一、MEB 核心价值与特性 1.1 产品定位 MySQL Enterprise Backup (MEB) 是Oracle官方推出的企业级物理热备份工具,专为MySQL 8.0设计,支持InnoDB/XtraDB引擎的在线备份,同时兼容MyISAM表的锁定备份。 1.2 核心优势 零停机热备份࿱…...
UE5从入门到精通之多人游戏编程常用函数
文章目录 前言一、权限与身份判断函数1. 服务器/客户端判断2. 网络角色判断二、网络同步与复制函数1. 变量同步2. RPC调用三、连接与会话管理函数1. 玩家连接控制2. 网络模式判断四、实用工具函数前言 UE5给我们提供了非常强大的多人网路系统,让我们可以很方便的开发多人游戏…...
[Web 安全] 反序列化漏洞 - 学习笔记
关注这个专栏的其他相关笔记:[Web 安全] Web 安全攻防 - 学习手册-CSDN博客 0x01:反序列化漏洞 — 漏洞介绍 反序列化漏洞是一种常见的安全漏洞,主要出现在应用程序将 序列化数据 重新转换为对象(即反序列化)的过程中…...
minio作为K8S后端存储
docker部署minio mkdir -p /minio/datadocker run -d \-p 9000:9000 \-p 9001:9001 \--name minio \-v /minio/data:/data \-e "MINIO_ROOT_USERjbk" \-e "MINIO_ROOT_PASSWORDjbjbjb123" \quay.io/minio/minio server /data --console-address ":90…...
Leetcode2717:半有序排列
题目描述: 给你一个下标从 0 开始、长度为 n 的整数排列 nums 。 如果排列的第一个数字等于 1 且最后一个数字等于 n ,则称其为 半有序排列 。你可以执行多次下述操作,直到将 nums 变成一个 半有序排列 : 选择 nums 中相邻的两…...
redis小记
redis小记 下载redis sudo apt-get install redis-server redis基本命令 ubuntu16下的redis没有protected-mode属性,就算sudo启动,也不能往/var/spool/cron/crontabs写计划任务,感觉很安全 #连接到redis redis-cli -h 127.0.0.1 -p 6379 …...
C/C++基础知识复习(47)
1) 接口继承与实现继承的区别 接口继承 接口继承意味着定义一个类,它只声明一组方法(通常是纯虚函数),但是不提供任何实现。继承这个接口的子类必须实现这些方法。接口继承的主要目的是规范化行为。 C 例子: 在 C 中…...
OkHttp、Retrofit、RxJava:一文讲清楚
一、okHttp的同步和异步请求 Call 是 OkHttp 的核心接口,代表一个已准备好执行的 HTTP 请求。它支持 同步 和 异步 两种模式: enqueue——>okHttp异步 OkHttpClient client new OkHttpClient();Request request new Request.Builder().url("…...
netty详细使用
Netty是一个基于Java的高性能网络应用框架,主要用于快速开发高性能的网络通信应用程序。以下是Netty的详细使用步骤: 添加Netty依赖:在项目的pom.xml中添加Netty的依赖项,例如: <dependency><groupId>io…...
计算机视觉(opencv-python)入门之图像的读取,显示,与保存
在计算机视觉领域,Python的cv2库是一个不可或缺的工具,它提供了丰富的图像处理功能。作为OpenCV的Python接口,cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV CV2常用图像处理方…...
ActiveMQ之VirtualTopic
一句话总结: VirtualTopic是为了解决持久化模式下多消费端同时接收同一条消息的问题。 现实中多出现这样一个场景: 生产端产生了一笔订单,作为消息MessageOrder发了出去。 这笔订单既要入订单系统归档,又要入结算系统收款&#x…...
第16届蓝桥杯模拟赛3 python组个人题解
第16届蓝桥杯模拟赛3 python组 思路和答案不保证正确 1.填空 如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。 请问, 2024 的最大的质因数是多少? 因为是填空题,所以直接枚举2023~2 &am…...
UE5 Computer Shader学习笔记
首先这里是绑定.usf文件的路径,并声明是用声明着色器 上面就是对应的usf文件路径,在第一张图进行链接 Shader Frequency 的作用 Shader Frequency 是 Unreal Engine 中用于描述着色器类型和其执行阶段的分类。常见的 Shader Frequency 包括:…...
2.1部署logstash:9600
实验环境:关闭防火墙,完成java环境 yum -y install wget wget https://d6.injdk.cn/oraclejdk/8/jdk-8u341-linux-x64.rpm yum localinstall jdk-8u341-linux-x64.rpm -y java -version 1.安装logstash tar xf logstash-6.4.1.tar.gz -C /usr/local…...
SQL笔记#集合运算
目录 一、表的加减法 1、什么是集合运算 2、表的加法——UNION 3、集合运算的注意事项 4、包含重复行的集合运算——ALL运算 5、选取表中公共部分——INTERSECT 6、记录的减法——EXCEPT 二、联结(以列为单位对表进行联结) 1、什么是联结(JOIN) 2、内联结——INSER…...
多模态人物视频驱动技术回顾与业务应用
一种新的商品表现形态,内容几乎存在于手淘用户动线全流程,例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力,能够从供给端缓解内容生产成本高的问题,通过源源不断的低成本供给倒推…...
基于Matlab实现汽车远近光灯识别的详细步骤及代码示例
以下是一个基于Matlab实现汽车远近光灯识别的详细步骤及代码示例,主要通过图像处理技术来区分远光灯和近光灯。 整体思路 图像预处理:包括读取图像、灰度化、去噪等操作,以提高后续处理的准确性。边缘检测:找出图像中的边缘信息…...
多功能免费网络测速及问题诊断工具
软件介绍 在日常网络使用中,网络问题常常难以即时察觉,很多时候,只有当视频卡顿、网页加载半天没反应,乃至无法连接部分服务时,我们才惊觉网络出状况了。 这里有一款免费工具,专为家庭、办公以及跨国网…...
【算法设计与分析】(一)介绍算法与复杂度分析
【算法设计与分析】(一)介绍算法与复杂度分析 前言一、什么是算法?二、算法的抽象机制三、描述算法四、复杂度分析4.1 时间复杂度4.2 空间复杂度 前言 从搜索引擎的高效检索,到推荐系统的个性化推荐,再到人工智能领域…...

