【数据结构与算法】 树

树:数据结构里的"家族"和层级管理利器

当你第一次接触数据结构,老师提到"树",你可能会疑惑:"树不是植物吗?怎么和程序有关?"

其实,树在程序里非常生活化,它的作用是组织信息,把复杂的数据关系变得清晰有序。掌握树,你就掌握了处理层级结构和递归问题的钥匙。


树的概念;什么是树

树是一种非线性结构 ,与链表、数组不同,它没有单一的线性顺序,而是分层次组织数据。

树有几个关键特点:

  • 根节点(root):树的最顶层节点,唯一

  • 节点(node):树的元素,每个节点可以有若干子节点

  • 子节点和父节点:节点的上下层关系

  • 叶子节点(leaf):没有子节点的节点

  • 无环:树中的路径不会回到自己

生活中的例子:电脑文件夹、公司组织架构、游戏技能树,都可以抽象成树。


父节点、子节点、兄弟节点;树的基本关系

树的层次关系类似家族关系:

  • 父节点:上一级节点

  • 子节点:下一级节点

  • 兄弟节点:同一级的其他节点

例如:

复制代码
        A
      /   \
     B     C
          / \
         D   E
  • A 是 B 和 C 的父节点

  • D 和 E 是兄弟节点

  • C 是 D 和 E 的父节点

把它想成家族树,你就很容易理解这些关系。


节点的度和树的高度;理解树的形态

  • 节点的度:一个节点有多少子节点

  • 树的度:整棵树中最大节点度

  • 树的高度:从根节点到最深叶子节点的层数

在上例中:

  • A 的度是 2

  • B 的度是 0

  • 树的高度是 3

理解度和高度,有助于分析树的性能和复杂度。


树的分类;常见树结构

树有多种类型,每种有不同应用:

  • 普通树:节点子节点数量不限

  • 二叉树:每个节点最多两个孩子(左、右)

  • 完全二叉树:除最后一层外,每层节点都满,最后一层从左到右排列

  • 满二叉树:所有叶子在同一层,每个非叶子节点有两个孩子

  • 二叉搜索树(BST):左子树 < 根节点 < 右子树

  • 平衡二叉树:高度平衡,保证查找效率

  • 树与森林:森林是多棵互不相交的树,树可以看作单棵树的森林

理解这些分类,可以在算法和实际应用中选择合适的树结构。


遍历树;访问节点的策略

遍历树是操作树的基础,核心问题是访问节点顺序

  • 前序遍历:先访问自己,再左子树,再右子树

  • 中序遍历:先左子树,再访问自己,再右子树

  • 后序遍历:先左子树,再右子树,最后访问自己

  • 层序遍历:按层从上到下,从左到右访问节点(队列实现)

例子:

复制代码
    A
   / \
  B   C
  • 前序:A B C

  • 中序:B A C

  • 后序:B C A

  • 层序:A B C

掌握遍历,你就能实现很多算法,例如计算叶子节点数量、树的深度、路径求和等。


树的存储方式;代码实现思路

树常用链式存储方式,用结构体指针表示父子关系。C语言示例:

复制代码
typedef struct TreeNode {
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

对于普通多叉树,可以用"孩子-兄弟表示法":

  • 左指针:指向第一个孩子

  • 右指针:指向下一个兄弟

这种表示法可以把任意树转换为二叉树,便于算法统一处理。


树的应用;实际场景举例

树的应用几乎无处不在:

  • 文件系统目录结构

  • HTML / DOM 树

  • 游戏技能树

  • 数据库索引(B树、B+树)

  • 编译器语法树(AST)

  • 网络分层结构、组织架构

掌握树,你就能理解和操作这些层级结构。


树与递归;为什么树离不开递归

树的自然层级关系,非常适合用递归操作:

  • 遍历树(前序、中序、后序)

  • 求树高、叶子节点数

  • 二叉搜索树插入、删除

  • 树的深度优先搜索、回溯问题

树结构和递归是天然搭档,理解递归才能轻松掌握树的算法。


总结

树是一种从上到下分层、无环、方便组织数据的结构。

理解树,不是记死定义,而是能在生活和编程中识别层级、关系和递归模式。

掌握树之后,很多复杂算法和数据结构问题都会迎刃而解。

相关推荐
zhangfeng11337 小时前
《从“人工适配“到“智能生成“:KernelSwift 跨国产芯片算子迁移全栈方案解读》 —— 强调范式跃迁和跨硬件属性,适合偏架构分析的写法
人工智能·算法·华为·ai编程·npu
0+1117 小时前
算法 --滑动窗口
c++·算法·leetcode
reikocao8 小时前
大场景下 Hessian 特征值放大与退化检测
算法
hetao17338378 小时前
2026-09-18 hetao1733837 的刷题记录
c++·算法
wuyk5559 小时前
21.计数排序:不用比较的“空间换时间”排序算法
python·算法·排序算法
船厂电气自动化ai大模型9 小时前
AI大模型与数学|第81天 课程:正交向量、正交基、格拉姆‑施密特(Gram‑Schmidt)正交化
开发语言·数据结构·人工智能·线性代数·机器学习
Rabitebla9 小时前
【Linux系统编程】 指令(二):一条路径是怎么定位到文件的
linux·c++·笔记·学习·算法
库玛西9 小时前
数据结构与算法之美:树、森林与二叉树全解析
c语言·数据结构·笔记·考研·算法·学习方法
木井巳9 小时前
【记忆化搜索】最长递增子序列
java·算法·leetcode·深度优先·剪枝·推荐算法
东方护航数据恢复(深圳)9 小时前
本地小算力设备数据恢复经典案例实操全解_东方护航数据恢复深圳店
大数据·服务器·算法·ai·gpu算力