在计算机科学的广袤森林中,有一种数据结构如同参天大树般支撑着无数应用的根基 —— 它就是 “树”(Tree)。它不仅仅是一个抽象概念,更是我们理解和组织信息、模拟现实世界层级关系的强大工具。

1. 什么是 “树”?从家族谱系说起

想象一下你的家族谱系图。从曾祖父母到父母,再到你和你的兄弟姐妹,每一代人都形成了层次分明的关系。数据结构中的 “树” 正是这一层次结构的抽象,它通过 ** 节点(Node)边(Edge)** 将信息组织成有序的层级体系。

树的核心组成部分

  • 根节点(Root):树的起点,像家族的源头,是唯一没有父节点的节点。
  • 子节点(Child)和父节点(Parent):每个节点(父节点)与一个或多个下级节点(子节点)相连,形成从上至下的层级关系。
  • 叶节点(Leaf):树的末端节点,没有子节点,代表最年轻的一代。
  • 内部节点(Internal Node):除根节点和叶节点外的其他节点,承载着父子关系。

树的核心特性

树的核心特点在于无环性单向性

  • 无环性:从根节点开始,沿着树枝一路向下,你无法回到起点。
  • 单向性:每个节点(除了根)只有一个父节点,确保了层级关系的清晰。

树的基本术语

为了更精确地描述树,我们还需要了解以下术语:

术语 (Term)定义 (Definition)示例 (Example)
祖先 (Ancestor)从根节点到当前节点路径上的所有节点。对于节点 子节点1.1,其祖先为 子节点1 和 根节点
后代 (Descendant)当前节点的子节点及其所有子节点。对于节点 子节点1,其后代为 子节点1.1 和 子节点1.2
兄弟 (Sibling)拥有相同父节点的节点。子节点1 和 子节点2 互为兄弟。
高度 (Height)从当前节点到最远叶节点的最长路径上的边数。根节点的高度为 2。
深度 (Depth)从根节点到当前节点的路径上的边数。子节点1.1 的深度为 2。

树的示意图:

                 根节点 (Root)|┌───┴───┐子节点1   子节点2  <-- 兄弟节点|┌────┴────┐子节点1.1  子节点1.2 <-- 叶节点

2. 树的形态:多样化的 “家族树”

树的形态多种多样,依赖于节点的子节点数量和结构特性。我们来看几种常见类型:

二叉树(Binary Tree)

每个节点最多只有两个子节点,通常被称为左子节点(Left Child)右子节点(Right Child)。二叉树是应用最广泛的树结构,常用在排序、查找、表达式求值等算法中。

示例:一棵简单的二叉树

         5/   \3      8/ \    /  \1   4  6    9

多叉树(Multiway Tree)

每个节点可以有多个子节点。它是二叉树的自然扩展,适用于表示更复杂的层级关系。

示例:公司的组织架构图

         CEO/ | \部门经理A 部门经理B 部门经理C

平衡树(Balanced Tree)

这种树的结构设计保证了从根到任意叶节点的距离(高度)尽可能相等,避免树变得过于 “高大” 或 “畸形”。这对于保证查找、插入和删除操作的高效率至关重要。

常见类型

  • AVL 树:一种严格平衡的二叉搜索树,左右子树的高度差(平衡因子)的绝对值不超过 1。
  • 红黑树:一种近似平衡的二叉搜索树,通过颜色规则(红、黑)来维持树的平衡,被广泛应用于 C++ 的std::map和 Java 的TreeMap中。

搜索树(Search Tree)

树的节点值遵循特定的排序规则,使得查找操作可以高效进行。

最典型的是二叉搜索树(Binary Search Tree, BST)

  • 规则:左子树的所有节点值都小于父节点,右子树的所有节点值都大于父节点。
  • 优势:理想情况下,查找、插入、删除的时间复杂度均为 O(log n),就像一本有序的电话簿。
  • 劣势:如果插入的数据是有序的(如 1,2,3,4,5),BST 会退化成一条链表,时间复杂度降为 O(n)

3. 为何 “树” 如此重要?现实世界的映射

树并非抽象的概念,它在现实世界中无处不在,是我们组织和访问信息的自然方式:

文件系统

你的电脑文件夹结构正是一个树形结构。根目录包含多个子目录,每个子目录下又有文件或子文件夹。

  根目录 (/)|┌─┴─┬─┬─┐文档 音乐 视频 图片|┌─┴─┐
工作 个人

网站导航与分类

电商网站的商品分类结构,如 “电子产品> 手机 > 智能手机”,同样是树的体现。这种层级结构让用户可以快速定位到自己感兴趣的内容。

组织结构图

公司、学校等机构的组织架构天然形成一棵树,清晰地定义了不同层级的职责与汇报关系。

决策树 (Decision Tree)

在机器学习中,决策树模型被用来将复杂问题分解成一系列简单的 “是 / 否” 判断,帮助计算机作出决策。例如,通过一系列特征(如年龄、收入、信用记录)来预测一个人是否会购买某产品。

语法分析

编译器在解析代码时,会构建一棵抽象语法树(Abstract Syntax Tree, AST)。这棵树精确地表示了代码的语法结构,是后续进行代码优化和生成目标机器码的基础。

人工智能中的搜索

在棋类(如国际象棋、围棋)等复杂游戏中,AI 会通过构建一棵 ** 博弈树(Game Tree)来模拟所有可能的走法,并使用极小极大算法(Minimax Algorithm)** 等策略来决定最佳的游戏策略。

4. 遍历树:探索 “森林” 的路径

要访问树中的所有节点,必须遍历整个结构。常用的遍历方式有两种:深度优先遍历(DFS) 和 广度优先遍历(BFS)

深度优先遍历(DFS - Depth-First Search)

从根节点开始,沿着一条路径向下走,直到最深处(叶节点),然后再回溯(Backtrack),继续沿另一条路径探索。这就像你在迷宫中,选择一条路走到头,不通再返回选择另一条路。

DFS 又可细分为三种主要策略:

  1. 前序遍历 (Pre-order Traversal)根 -> 左 -> 右

    • 访问顺序:先访问当前节点,再递归地遍历左子树,最后递归地遍历右子树。
    • 应用:复制一棵二叉树、获取树的前缀表达式。
  2. 中序遍历 (In-order Traversal)左 -> 根 -> 右

    • 访问顺序:先递归地遍历左子树,再访问当前节点,最后递归地遍历右子树。
    • 应用:对一棵二叉搜索树(BST)进行中序遍历,可以得到一个升序排列的节点值序列。
  3. 后序遍历 (Post-order Traversal)左 -> 右 -> 根

    • 访问顺序:先递归地遍历左子树,再递归地遍历右子树,最后访问当前节点。
    • 应用:计算一棵二叉树的高度、删除一棵二叉树。

DFS 遍历示意图(以中序遍历为例)

         5/   \3      8/ \    /  \1   4  6    9中序遍历结果:1 -> 3 -> 4 -> 5 -> 6 -> 8 -> 9

广度优先遍历(BFS - Breadth-First Search)

也称为层序遍历(Level-order Traversal)。它先访问离根节点最近的一层节点(即所有子节点),再逐层深入,访问下一层的所有节点。这就像剥洋葱,一层一层地访问。

实现方式:通常使用一个 ** 队列(Queue)** 来实现。

  1. 将根节点入队。
  2. 当队列不为空时:
    a. 出队一个节点并访问。
    b. 将该节点的所有子节点(通常按从左到右的顺序)入队。

BFS 遍历示意图

         5    <-- 第一层/   \3      8  <-- 第二层/ \    /  \1   4  6    9 <-- 第三层层序遍历结果:5 -> 3 -> 8 -> 1 -> 4 -> 6 -> 9

结语:数据世界的基石

树不仅是数据结构中一个重要的抽象,更是我们理解和解决问题的一把利剑。它的层次性、分支性和无环性使得它能够高效地组织信息,并在现实世界中发挥着重要作用。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术框架之RPC

一、序言&#xff1a;为什么我们需要RPC&#xff1f;在单体应用时代&#xff0c;函数调用是进程内的简单操作。但随着业务规模扩大&#xff0c;系统被拆分为多个独立服务&#xff08;如订单服务、支付服务&#xff09;&#xff0c;服务间通信成为刚需。早期开发者常使用HTTPJSO…

【光照】Unity中的[光照模型]概念辨析

【从UnityURP开始探索游戏渲染】专栏-直达 基础光照模型‌ ‌标准光照模型&#xff08;Standard Lighting Model&#xff09;‌ ‌定义‌&#xff1a;传统光照计算的框架&#xff0c;通常包含漫反射、镜面反射和环境光三部分。‌特点‌&#xff1a;非物理经验模型&#xff0c…

MCU上跑AI—实时目标检测算法探索

MCU上跑实时目标检测算法 前几年一直忙着别的事情没有在技术分享上下功夫, 这段时间稳定下来就想和几个志同道合的朋友做点有意义的事情, 于是乎就使用MCU做了个与AI有识别相关的 “小玩意儿”. 本人负责嵌入式端相关的编码, AI相关的工作由好友 AgeWang 负责. 这儿把一些成果给…

SpringBoot 整合 RabbitMQ 的完美实践

引言: 本文总字数:约 9200 字 预计阅读时间:38 分钟 为什么 RabbitMQ 是消息中间件的优选? 在分布式系统架构中,消息中间件扮演着 "交通枢纽" 的角色,负责协调各个服务之间的通信。目前主流的消息中间件有 RabbitMQ、Kafka 和 RocketMQ,它们各具特色: Kafka…

nestjs 发起请求 axios

1、下载npm i --save nestjs/axios axios2、全局配置import { HttpModule } from nestjs/axios;Global() Module({imports: [HttpModule.registerAsync({inject: [ConfigService],useFactory: async (configService: ConfigService) > {return {timeout: configService.get(…

将 Logits 得分转换为概率,如何计算

场景&#xff1a;动物识别&#xff0c;输入一张28*28的图像&#xff0c;模型输出属于 猫、狗、鸟 哪个类型。需求&#xff1a;假设模型 ​​Logits&#xff08;模型在每个类别的置信度得分&#xff09; 输出为​​&#xff1a;[猫: 3.2, 狗: 1.5, 鸟: -0.8]。计算 ​​Softmax …

【Qt】bug排查笔记——QMetaObject::invokeMethod: No such method

问题如题目所示&#xff1a;QMetaObject::invokeMethod: No such method xxxx&#xff0c;在网上好一顿查&#xff0c;又将查到的资料喂给了 Ai&#xff0c;才最终将问题解决&#xff0c;特此记录下。 一、问题背景 在做公司项目时&#xff0c;使用了插件的方式开发。主程序加载…

Spring Boot手写10万敏感词检查程序

使用Spring Boot手写10万敏感词检查程序 本文将介绍如何使用Spring Boot构建一个高效的敏感词检查系统,能够处理多达10万个敏感词的检测需求。我们将使用DFA(Deterministic Finite Automaton)算法来实现高效匹配,并提供RESTful API接口。 实现步骤 1. 创建Spring Boot项…

零构建的快感!dagger.js 与 React Hooks 实现对比,谁更优雅?

“Add Tags” 技术方案并行对比&#xff1a;React Hooks vs dagger.js&#xff08;含核心 JS 代码&#xff09; 源码&#xff1a; React Hooks&#xff1a;https://codepen.io/prvnbist/pen/jJzROe?editors1010dagger.js&#xff1a;https://codepen.io/dagger8224/pen/ZErjzw…

矩池云中LLaMA- Factory多机多卡训练

LLaMA Factory 是一款开源低代码大模型微调框架&#xff0c;集成了业界最广泛使用的微调技术&#xff0c;支持通过 Web UI 界面零代码微调大模型&#xff0c;目前已经成为开源社区内最受欢迎的微调框架之一。但是在矩池云上如何使用LLaMA-Factory多机多卡训练模型呢&#xff1f…

Nginx的反向代理与正向代理及其location的配置说明

一、Nginx中location匹配优先级Nginx中location匹配优先级location支持各种匹配规则&#xff0c;在多个匹配规则下&#xff0c;Nginx对location的处理是有优先级的&#xff0c;优先级高的规则会优先进行处理&#xff1b;而优先级低的规则可能会最后处理或者不进行处理。注意&am…

神经网络正则化三重奏:Weight Decay, Dropout, 和LayerNorm

正则化是机器学习中防止模型过拟合、提升泛化能力的核心技术。Weight Decay、Dropout和LayerNorm是三种最常用的方法&#xff0c;但它们的工作原理和首要目标截然不同。下面的流程图揭示了它们的核心区别与联系&#xff1a; #mermaid-svg-vymek6mFvvfxcWiM {font-family:"…

两台电脑通过网线直连共享数据,设置正确,却互相ping不通的解决方法

因为某些原因&#xff0c;需要两台电脑互传资源&#xff0c;但是某台电脑可能无法连接外网。如果手头有根网线&#xff0c;很容易想到通过一根网线连接两台电脑互传数据。 这里先说一下基本的设置&#xff1a; 两台电脑最好都关闭防火墙&#xff1b;两台电脑都打开专用网络和公…

面试新纪元:无声胜有声,让AI成为你颈上的智慧伙伴

面试&#xff0c;无论是对于面试官还是求职者&#xff0c;都像一场无声的战争。 一方要精准识人&#xff0c;一方要完美自荐&#xff1b;一方怕问不到点子上&#xff0c;一方怕答不到心坎里。 紧张、遗忘、表达失误、准备不足……这些问题几乎每个人都经历过。 有没有一种方…

qt-C++笔记之QtDesigner-Creator按钮图标与样式

qt-C笔记之QtDesigner-Creator按钮图标与样式 整理&#xff1a;如何用 .qrc 管理资源、在 Designer/Creator 中为 QPushButton 设置图标&#xff08;资源或系统主题&#xff09;&#xff0c;以及用样式表调整文字样式。涵盖 C/Qt 与 PySide/PyQt&#xff1b;Linux 桌面优先&am…

maven 常用指令

Maven 是 Java 项目构建和依赖管理的得力助手。这里为你总结了一些常用指令&#xff0c;希望能帮你提升开发效率。下面这个表格汇总了 Maven 最核心和常用的一些命令&#xff1a;命令主要功能典型使用场景mvn clean清理项目&#xff0c;删除 target 目录及其所有编译输出文件。…

# pdf.js完全指南:构建现代Web PDF查看与解析解决方案

在当今Web开发中&#xff0c;实现高质量的PDF查看功能一直是前端开发者面临的挑战之一。作为最受欢迎的JavaScript PDF库&#xff0c;pdf.js已经成为解决这一问题的行业标准。由Mozilla开发并维护的pdf.js项目&#xff0c;通过纯JavaScript实现PDF解析与渲染&#xff0c;彻底改…

高效对象属性复制工具

日常编程中&#xff0c;经常会碰到对象属性复制的场景&#xff0c;比如 VO、DTO、PO、VO 等之间的转换&#xff0c;关于什么是VO、DTO、PO、VO 等可以看上篇文章&#xff0c;VO、DTO、PO、VO 等对象具体有哪些方式可以使用呢&#xff1f; set/get 方式 性能最好的方式&#x…

大疆图传技术参数对比 你了解多少?

无人机是现代航空技术与智能控制技术结合的产物&#xff0c;已从军事领域广泛渗透至民用场景&#xff0c;成为推动各行业效率升级的关键工具。无人机的全称为 “无人驾驶航空器&#xff08;Unmanned Aerial Vehicle&#xff0c;简称 UAV&#xff09;”&#xff0c;简言之&#…

Redis 缓存热身(Cache Warm-up):原理、方案与实践

在 Redis 缓存架构中&#xff0c;“缓存热身”是指在系统正式提供服务前&#xff08;如重启、扩容后&#xff09;&#xff0c;主动将热点数据加载到 Redis 中的操作。其核心目标是避免**缓存穿透**&#xff08;请求直达数据库&#xff09;和**缓存雪崩**&#xff08;大量请求同…