数据结构-树(基础,分类,遍历)

news2024/9/20 16:51:14

数据结构-树

1.什么是树?

在计算机科学中,是一种常用的非线性数据结构,用于表示具有层次关系的数据。与线性数据结构(如数组和链表)不同,树结构以节点(Nodes)和边(Edges)组成,通过根节点(Root Node)进行组织。每个节点可以有零个或多个子节点,形成一系列层级结构。

树的基本术语包括:

  • 根节点(Root):树的最上层节点,没有父节点。
  • 节点(Node):树中的基本单元,包含数据和指向子节点的引用。
  • 子节点(Child):直接连接到某一节点的节点。
  • 父节点(Parent):直接连接到子节点的节点。
  • 叶节点(Leaf):没有子节点的节点。
  • 深度(Depth):节点到根节点的路径长度。
  • 高度(Height):节点到其最远叶节点的路径长度。

2.树的类型

  • 二叉树(Binary Tree):每个节点最多有两个子节点(左子节点和右子节点)。
  • 二叉搜索树(Binary Search Tree, BST):左子树的所有节点值小于根节点值,右子树的所有节点值大于根节点值。
  • 平衡树(Balanced Tree):如 AVL 树和红黑树,保持树的高度平衡,以优化插入、删除和查找操作的时间复杂度。
2.1. 二叉树(Binary Tree)

在这里插入图片描述

定义:二叉树是一种每个节点最多有两个子节点的树形结构。每个节点通常包含三个部分:数据、左子节点、右子节点。

特点

  • 结构:每个节点有至多两个子节点,通常称为左子节点和右子节点。
  • 类型:包括满二叉树(每个节点都有两个子节点)、完全二叉树(除了最底层外,所有层都是满的)和不完全二叉树(节点可能只有一个子节点)。

完全二叉树和非完全二叉树:

在这里插入图片描述

用途:广泛应用于表达结构性的数据,例如表达式树、决策树等。

2.2. 二叉搜索树(Binary Search Tree, BST)

在这里插入图片描述

定义:二叉搜索树是一种特殊的二叉树,其中每个节点的左子树包含小于该节点值的节点,右子树包含大于该节点值的节点。(值)

特点

  • 性质:对于每个节点,左子树的所有节点值小于该节点值,右子树的所有节点值大于该节点值。
  • 操作:插入、删除和查找操作可以在平均 O(log n) 时间复杂度下完成,前提是树是平衡的。

用途:常用于实现高效的查找、插入和删除操作。

2.3. 平衡树(Balanced Tree)

定义:平衡树是一种自我调整的二叉搜索树,确保树的高度在一个合理范围内,从而优化操作效率。

类型

  • AVL 树:一种严格平衡的二叉搜索树,其中每个节点的左右子树高度差最多为1。插入和删除操作后,可能需要进行旋转来保持平衡。
  • 红黑树:一种较宽松的平衡树,其中每个节点都有一个颜色属性(红色或黑色),并且遵循一系列规则来确保树的平衡。红黑树在插入和删除时也进行必要的旋转和重新着色。

特点

  • AVL 树:高度更严格平衡,查询操作通常较快,但插入和删除的旋转次数可能较多。
  • 红黑树:维护平衡较为宽松,插入和删除操作的复杂度较低,但查询操作可能稍慢。

用途:用于实现具有自平衡特性的高效数据结构,如Java的 TreeMapTreeSet

3.二叉树的存储

二叉树的存储结构通常有两种方式:顺序存储和‌链式存储。顺序存储适用于完全二叉树,而链式存储则更为灵活,适用于不完全二叉树。二叉树的遍历方式包括‌前序遍历、‌中序遍历、‌后序遍历和‌层序遍历(广度遍历),这些遍历方式按照不同的顺序访问树的节点。

4.二叉树的遍历

二叉树的遍历是指按某条搜索路径访问树中的每个结点,使得每个结点均被访问一次。

1)先序遍历

若二叉树为空,则返回,否则先访问根节点,再先序遍历左子树,再先序遍历右子树。

void PreOrderVisit(BiTree T) {
	if (T != NULL) {
		visit(T);
		PreOrderVisit(T->lchild);
		PreOrderVisit(T->rchild);
	}
}

2)中序遍历

若二叉树为空,则返回,否则先中序遍历左子树,再访问根节点,再中序遍历右子树。

void InOrderVisit(BiTree T) {
	if (T != NULL) {
		InOrderVisit(T->lchild);
		visit(T);
		InOrderVisit(T->rchild);
	}
}

3)后序遍历

若二叉树为空,则返回,否则先后序遍历左子树,再后序遍历右子树,再访问根节点。

void PostOrderVisit(BiTree T) {
	if (T != NULL) {
		PostOrderVisit(T->lchild);
        PostOrderVisit(T->rchild);
		visit(T);
	}

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

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

相关文章

日元走强引领外汇市场新动向,全球经济指标波动加剧

日元看涨情绪升温 近期,外汇市场上日元成为焦点,对冲基金纷纷增加对日元上涨的期权投注,预计其将延续本季度强劲表现。上周五,美元兑日元收跌0.65%,盘中触及年内低点,显示出市场对日元未来走势的乐观预期。…

一文了解什么是TTP — 技术、战术与程序

导语:TTP的概念最早来自于军事领域及反恐活动,后面逐渐被应用到网络安全领域,在网络安全中,TTP(技术、战术与程序)是一个核心概念,它涵盖了攻击者使用的工具、技术和方法,以及他们执…

HTML+CSS - 网页布局之多列布局定位

1. 多列布局 CSS中多列布局处理文本内容&#xff0c;特别适合对于长段落或者大量文本进行自动分栏显示 类似于grid分布&#xff0c;但相较之下更加简洁明了 基本语法 <div class"container"><p>这是一些示例文本&#xff0c;当我们使用 column-count…

SpringBoot Kafka发送消息与接收消息实例

前言 Kafka的基本工作原理 我们将消息的发布&#xff08;publish&#xff09;称作 producer(生产者)&#xff0c;将消息的订阅&#xff08;subscribe&#xff09;表述为 consumer&#xff08;消费者&#xff09;&#xff0c;将中间的存储阵列称作 broker(代理)&#xff0c;这…

酷炫的航模直升机技术详解

1. 分类与级别&#xff08;400级至90级&#xff09; 航模直升机以其独特的飞行魅力和高难度的操作技巧&#xff0c;吸引了众多飞行爱好者。根据模型的尺寸、重量、动力系统及飞行性能&#xff0c;航模直升机大致可分为多个级别&#xff0c;从入门级的400级到专业级的90级及以上…

简单接口自动化框架实现(Python+requests+pytest)

1、接口自动化流程 1.需求分析2.挑选需要做自动化测试的功能3.设计测试用例4.搭建自动化测试环境[可选]5.设计自动化测试项目的架构[可选]6.编写代码7.执行测试用例8.生成测试报告并分析结果 2、框架结构 --api -->封装请求 --scripts -->编写测试脚本…

15. Springboot集成Redis

目录 1、前言 2、为什么选择Spring Boot集成Redis&#xff1f; 3、快速上手 3.1、引入依赖 3.2、 配置连接信息 3.3、自定义配置类 4、RedisTemplate的使用 4.1、String类型操作 4.2、 Hash类型操作 4.3、List类型操作 4.4、Set类型操作 4.5、SortedSet类型操作 4…

有了数据中台,是否需要升级到数据飞轮?怎么做才能升级到数据飞轮?

在数字化转型的时代&#xff0c;企业纷纷建设了“数据中台”&#xff0c;把各种业务数据整合在一起&#xff0c;仿佛是将所有材料都整理进了厨房的储物柜。 但是问题是&#xff1a;光有储物柜&#xff0c;能做出好吃的菜吗&#xff1f;答案显然是否定的。想要真正利用这些数据…

华为HarmonyOS地图服务 -- 如何实现地图呈现?-- HarmonyOS自学8

如何使用地图组件MapComponent和MapComponentController呈现地图&#xff0c;效果如下图所示。 MapComponent是地图组件&#xff0c;用于在您的页面中放置地图。MapComponentController是地图组件的主要功能入口类&#xff0c;用来操作地图&#xff0c;与地图有关的所有方法从此…

项目实现:云备份③(配置文件加载模块、数据管理模块的实现)

云备份 前言配置文件加载模块配置信息的设计单例文件配置类设计 数据管理模块数据信息类设计数据管理类实现数据持久化存储初始化加载实现 前言 书接上回&#xff1a;云备份&#xff08;实用工具类&#xff09;实现后&#xff0c;接下来会逐步实现不同模块的功能。会频繁用到工…

更主动的对话规划者:PPDPP论文解读

摘要 主动对话在大语言模型&#xff08;LLMs&#xff09;时代中是一个实际且具有挑战性的对话问题&#xff0c;其中对话策略规划是提升LLMs主动性的重要关键。现有的大多数研究通过各种提示方案或使用口头AI反馈迭代增强处理特定案例的能力&#xff0c;以实现LLMs的对话策略规…

元宇宙+教育:打造个性化、互动化学习生态系统!

近两年来&#xff0c;元宇宙风在全球迅速掀起了一股新浪潮。“元宇宙”成为各个行业的热门发展方向&#xff0c;各个行业正试图通过元宇宙寻求新的发展突破口&#xff0c;教育行业也不例外。 教育培训元宇宙作为一种前沿的教育模式&#xff0c;深度融合了虚拟现实、增强现实及…

SAP HCM HR_MAINTAIN_MASTERDATA自带解锁功能

导读 锁功能&#xff1a;在SAP HCM模块有针对人的加锁功能&#xff0c;今天遇到的一个问题是&#xff0c;人员无法被锁住&#xff0c;给我第一反应就是代码没有加锁&#xff0c;代码有问题&#xff0c;但是去看代码系统确实已经加锁&#xff0c;但是系统还是提示这个&#xff…

BPF 调度器 sched_ext 实现机制、调度流程及样例

本文地址&#xff1a;https://www.ebpf.top/post/bpf_sched_ext_dive_into 在文章 Linus 强势拍板合入: BPF 赋能调度器终成正果中&#xff0c;我们回顾了 BPF 在调度器在合入社区过程中的历程&#xff0c;补丁 V7 已经在为合并到 6.11 做好了准备&#xff0c;后续代码仓库也变…

4. 认识 LoRA:从线性层到注意力机制

如果你有使用过 AI 生图&#xff0c;那你一定对 LoRA 有印象&#xff0c;下图来自Civitai LoRA&#xff0c;上面有很多可供下载的LoRA模型。 你可能也曾疑惑于为什么只导入 LoRA 模型不能生图&#xff0c;读下去&#xff0c;你会解决它。 文章目录 为什么需要 LoRA&#xff1f;…

预训练数据指南:衡量数据年龄、领域覆盖率、质量和毒性的影响

前言 原论文&#xff1a;A Pretrainer’s Guide to Training Data: Measuring the Effects of Data Age, Domain Coverage, Quality, & Toxicity 摘要 预训练是开发高性能语言模型&#xff08;LM&#xff09;的初步和基本步骤。尽管如此&#xff0c;预训练数据的设计却严…

STM32 HAL freertos零基础(十一)中断管理

1、简介 在FreeRTOS中,中断管理是一个重要的方面,尤其是在嵌入式系统中。正确地处理中断可以确保系统的实时响应能力,并且能够在中断服务程序(ISR)中执行关键操作。FreeRTOS提供了一些机制来帮助开发者管理中断,并确保在多任务环境下中断处理的安全性和高效性。 任何中…

【AI大模型】Transformer模型:Postion Embedding概述、应用场景和实现方式的详细介绍。

一、位置嵌入概述 \1. 什么是位置嵌入&#xff1f; 位置嵌入是一种用于编码序列中元素位置信息的技术。在Transformer模型中&#xff0c;输入序列中的每个元素都会被映射到一个高维空间中的向量表示。然而&#xff0c;传统的自注意力机制并不包含位置信息&#xff0c;因此需要…

3CCD的工作原理

昨天看编辑送的一本《计算机视觉》中3CCD的工作原理错了&#xff0c;其实是百度百科错了&#xff0c;所以我想有人就照搬照抄错了。专业问题不要问百度&#xff0c;百度就是骗子一样的存在&#xff0c;这么多年就从来没有把心思放在做事上。3CCD通过光学棱镜分光后就已经是单色…

智能摄像头MP4格式化恢复方法

如果说生孩子扎堆&#xff0c;那很显然最近智能摄像头多碎片的恢复也扎堆了&#xff0c;这次恢复的是一个不知名的小品牌。其采用了mp4视频文件方案&#xff0c;不过这个案例的特殊之处在于其感染了病毒且不只一次&#xff0c;我们来看看这个小品牌的智能恢复头格式化的恢复方法…