【数据结构与算法】 树

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

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

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


树的概念;什么是树

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

树有几个关键特点:

  • 根节点(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)

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

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


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

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

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

  • 求树高、叶子节点数

  • 二叉搜索树插入、删除

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

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


总结

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

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

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

相关推荐
LSL666_2 小时前
Redis值数据类型——hash
redis·算法·哈希算法·数据类型
喵喵蒻葉睦2 小时前
力扣 hot100 滑动窗口最大值 单调双端队列 java 简单题解
java·数据结构·算法·leetcode·双端队列·滑动窗口·队列
样例过了就是过了2 小时前
LeetCode热题100 搜索二维矩阵
数据结构·c++·算法·leetcode·矩阵
2401_831920742 小时前
C++与Qt图形开发
开发语言·c++·算法
Shining05962 小时前
AI 编译器系列(四)《AI 编译器中的后端优化》
linux·服务器·人工智能·线性代数·算法·triton·ai编译器
像污秽一样2 小时前
算法设计与分析-习题8.1
数据结构·算法·dfs·dp
飞天狗1112 小时前
最小生成树算法
算法
H_老邪3 小时前
贪心算法的应用
算法·ios·贪心算法
葳_人生_蕤3 小时前
Hot100——739.每日温度
数据结构·算法