数据结构-二叉树-基础知识
数据结构-二叉树-基础知识
- 1.树
- 1.1什么是树
- 1.2基本概念
- 子节点、父节点
- 叶节点
- 节点的度
- 树的高度/深度
- 节点的子孙、祖先
- 1.3树与非树
- 1.4如何实现
- 1.5实例
- 2.二叉树
- 2.1什么是二叉树
- 2.2特殊的二叉树
- 满二叉树
- 完全二叉树
- 2.3性质
- 层数
- 度
- 节点
- 2.4存储结构
1.树
1.1什么是树
树型结构是一类重要的非线性数据结构。树是以分支关系定义的层次结构。
把它叫做“树”是因为它常看起来像一棵倒挂的树,也就是说它常是根朝上,而叶朝下的。
1.2基本概念
子节点、父节点
子节点也叫孩子节点。
子节点:在树形图中,当前节点的各个子树的根称为当前节点的子节点。即当前节点所直接支配的节点。
可理解为:指该节点下一层与其直接相连的节点。
A
的子节点为B
、C
、D
。
E
的子节点为J
、K
。
对于各个子节点,它们上面的那个就叫父节点,也叫双亲节点。
B
、C
、D
的父节点为A
。
J
、K
的父节点为E
。
叶节点
叶节点也叫终端节点、叶子。特点是度为0
。
对于上图,C
、F
、G
、H
、I
、J
、K
就是叶节点。
节点的度
节点的度:节点拥有子节点的数量。
可理解为:该节点的下一层与其直接相连的节点数。
A
的度为3
。
D
的度为4
。
树的高度/深度
指树的最大层次。
上图,树的高度为4
。
节点的子孙、祖先
子孙:指该节点下面所有与其直接或间接相连的节点。
祖先:指从该节点到根所经过的所有节点。
B
的子孙为E
、J
、K
。
J
的祖先为E
、B
、A
。
A
为所有节点的祖先。
1.3树与非树
对于一个树,有几个重要的特点:
- 子树不能相交。
- 除了根节点,每个节点有且仅有一个父节点。
- 有
N
个节点,就有N+1
条边。
反例:
1.4如何实现
左孩子右兄弟表示法。
即,在每个节点中,存储其最左边的子节点的地址、其右边那个兄弟节点的地址。
大概是这样:
typedef int DataType;
struct TreeNode
{struct TreeNode* pFistChild;struct TreeNode* pNextBorther;DataType data;
};
1.5实例
如文件夹:
2.二叉树
2.1什么是二叉树
二叉树每个节点的度最大为二,即,每个节点最多分出两个子树,且有左右之分。
每一个二叉树都由下面几种情况组合而成:
2.2特殊的二叉树
满二叉树
每层都是满的,就是满二叉树,如下面这几个:
完全二叉树
现假设有个满二叉树,有h
层,那么,在第h
层的最后去掉几个节点就得到完全二叉树:
需注意:满二叉树是特殊的完全二叉树。
2.3性质
层数
令根节点层数为1。
层数 | 1 | 2 | 3 | 4 | … | h |
---|---|---|---|---|---|---|
每层最多节点数 | 1 | 2 | 4 | 8 | … | 2^(h-1) |
最多节点总数 | 1 | 3 | 7 | 15 | … | (2^h)-1 |
n
个节点的满二叉树:层数h=log(n+1)
。
度
- 对任意的二叉树,当度为
2
的节点有n1
个,度为0
的节点有n2
个,有n2=n1+1
。
节点
n
个节点的完全二叉树,由根节点开始从0
编号。
那么,对于一个序号为k
的节点,有:
k == 0
,为根;k != 0
,双亲节点的序号为(k-1)/2
。
如对D
、E
:(4-1)/2 == (3-1)/2 == 1
。- 当
2*k + 1 < n
,左孩子序号为2k+1
。 - 当
2*k + 2 < n
,右孩子序号为2k+2
。
2.4存储结构
可用两种结构存储,一种顺序结构,一种链式结构。
顺序结构:用数组存储,一般只适合完全二叉树,否则会造成空间浪费。
链式结构:用链表存储,用指针链接节点。
希望本篇文章对你有所帮助!并激发你进一步探索数据结构的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!
相关文章:

数据结构-二叉树-基础知识
数据结构-二叉树-基础知识 1.树1.1什么是树1.2基本概念子节点、父节点叶节点节点的度树的高度/深度节点的子孙、祖先 1.3树与非树1.4如何实现1.5实例 2.二叉树2.1什么是二叉树2.2特殊的二叉树满二叉树完全二叉树 2.3性质层数度节点 2.4存储结构 1.树 1.1什么是树 树型结构是一…...

wangeditor——cdn引入的形式创建一个简易版编辑器——js技能提升
昨天同事那边有个需求,就是要实现聊天功能,需要用到一个富文本编辑器,参考如下: 上面的这个效果图是博客园的评论输入框 最终使用wangEditor编辑器实现的效果如下: 只保留了个别的菜单: 默认模式的wangE…...

9.11.
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(this)) {//设置时钟ui->setupUi(this);startTimer(1000);//文本框label居中对齐ui->label_2->setAlignment(Qt::AlignCenter);connect(this,&Widget::my_sign…...

【GeekBand】C++设计模式笔记1_介绍
课程目标 理解松耦合设计思想掌握面向对象设计原则掌握重构技法改善设计掌握GOF核心设计模式 什么是设计模式 目标:复用,以不变应万变 GOF设计模式 从面向对象谈起 深入理解面向对象 向下:深入理解三大面向对象机制 封装:隐藏…...

MySQL 数据库:原理、应用与发展
摘要:本文深入探讨了 MySQL 数据库相关内容。首先介绍了 MySQL 作为开源关系型数据库管理系统的显著特点,包括易用性、跨平台性、高性能、可扩展性、开源免费以及数据安全性等方面。接着详细阐述了其安装与配置过程,涵盖在不同操作系统上的安…...

7.2图像旋转
实验原理 在OpenCV中,图像旋转也是一种常见的几何变换,它可以用来调整图像的方向。图像旋转通常涉及绕着图像中心点旋转一定角度的操作。与图像平移类似,旋转也可以通过仿射变换来实现,但是旋转需要使用到旋转矩阵来定义旋转的角…...

学学vue-2
1.7 指令修饰符 keyup.enter:监听键盘回车事件,回车触发事件keyup.enter代码 v-model修饰符: v-model.trim:去首尾空格v-model.number:变数字(如果是数字的话,转变为数字) 事件名.…...

什么是 Grafana?
什么是 Grafana? Grafana 是一个功能强大的开源平台,用于创建、查看、查询和分析来自多个来源的数据。通过可视化仪表盘(Dashboard),它能够帮助用户监控实时数据、生成历史报告,甚至进行预测分析。Grafana…...

【Prompt Engineering:思维树 (ToT)、检索增强生成 (RAG)、自动推理并使用工具 (ART)】
思维树 (ToT) 对于需要探索或预判战略的复杂任务来说,传统或简单的提示技巧是不够的。最近,Yao et el. (2023)(opens in a new tab) 提出了思维树(Tree of Thoughts,ToT)框架,该框架基于思维链提示进行了总…...
【习题】应用/元服务上架
判断题 1. 一个完整的发布软件包必须包含一个Profile文件。 A、正确(True) B、错误(False) 2. 编译打包的软件包存放在项目目录build > outputs > default下。 A、正确(True) B、错误(False) 单选题 1. 创建应用时,应用包名需要和在DevEco …...

性能测试的复习3-jmeter的断言、参数化、提取器
一、断言、参数化、提取器 需求: 提取查天气获取城市名请求的响应结果:城市对查天气获取城市名的响应结果进行响应断言和json断言对查天气获取城市名添加用户参数 1、步骤 查看天气获取城市名 json提取器(对响应结果提取、另一个接口请求…...

ORB-SLAM2关键点总结
1.ORB-SLAM2的总体框架是怎样的 ORB-SLAM2一共有三个线程,分别是Tracking、Local Mapping、Loop Closing线程,,其中Tracking负责完成关键点提取,并进行帧间匹配,同时初步选取关键帧;Local Mapping线程主要…...

拱式桥安全结构健康监测解决方案
拱式桥作为一种常见的桥梁结构,其拱形设计不仅美观,还具有较高的承载能力。然而,随着使用年限的增加和环境因素的影响,拱式桥的结构健康和稳定需要持续监测和评估。自动化监测技术的应用,可以提升拱式桥的监测效率和准…...

windows和linux安装mysql5.7.31保姆级教程
一,资源如下,里面有windows和linux版的安装软件,内含Visual C2013中文版windows系统插件 windows资源地址:https://download.csdn.net/download/l1o3v1e4ding/89725150 linux(centos)资源地址:…...
如何使用 PowerShell 脚本来自动化 Windows 开发流程的教程(包括理论介绍和实践示例)
PowerShell 是一种强大的任务自动化和配置管理框架,它为系统管理员和开发人员提供了管理 Windows 操作系统和应用程序的能力。下面是一个关于如何使用 PowerShell 脚本来自动化 Windows 开发流程的教程,包括理论介绍和实践示例。 第一部分:理…...

CTFHub技能树-信息泄露-HG泄漏
目录 漏洞产生原因 解题过程 当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。 漏洞产生原因 Mercurial(hg)是一种分布式版本控制系统,它与Git类似也可以用于管…...
OpenCV结构分析与形状描述符(18)比较两个轮廓相似度的函数matchShapes()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 比较两个形状。 该函数用于比较两个形状。所有三个实现的方法都使用了 Hu 不变矩(参见 HuMoments) 函数原型 double c…...

CCS811二氧化碳传感器详解(STM32)
目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 ccs811.h文件 ccs811.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 CCS811模块是一种气体传感器,可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2…...

Navicat 17 新特性 | 聚焦 MongoDB
随着 Navicat 17 的盛大发布,其一系列创新特性赢得了广大用户的热烈反响。它不仅在模型设计上实现了突破性优化,提升了查询与配置的效率,还大幅优化了用户界面的交互体验,原生支持国产平台与操作系统,同时增强 BI 能力…...

openssl的使用
1、编译 Github下载:https://github.com/openssl/openssl 官网下载:https://openssl-library.org/source/index.html 官网历史版本:https://www.openssl.org/source/old/ 1.1 Windows下编译 我的文章:OPC UA使用 Openssl库编译…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...