【数据结构与算法】 树

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

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

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


树的概念;什么是树

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

树有几个关键特点:

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

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

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


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

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

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

  • 求树高、叶子节点数

  • 二叉搜索树插入、删除

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

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


总结

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

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

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

相关推荐
8Qi844 分钟前
LeetCode 115 & 392:不同子序列 / 判断子序列
算法·leetcode·职场和发展·动态规划
小蒋学算法1 小时前
算法-乘法表中第K小的数-二分
数据结构·算法
智者知已应修善业1 小时前
【51单片机8个LED,已经使用了D1D2,怎么样在不动D1D2的前提下实现D6~D8的流水灯】2024-1-19
c++·经验分享·笔记·算法·51单片机
Evand J1 小时前
【MATLAB例程】自适应渐消扩展卡尔曼滤波(AFEKF)三维雷达目标跟踪|效果已调优,附下载链接和运行结果,代码直接运行即可
开发语言·算法·matlab·目标跟踪·卡尔曼滤波·自适应滤波·代码定制
插件开发2 小时前
矢量路径运算如何选GPU技术?——适用算法对比及OpenGL/Direct3D/CUDA选型指南
算法·3d
8Qi82 小时前
LeetCode 72:编辑距离(Edit Distance)—— 题解
算法·leetcode·职场和发展·动态规划
SoftLipaRZC2 小时前
顺序表的应用:通讯录项目与经典算法实战
算法
8Qi82 小时前
LeetCode 583. 两个字符串的删除操作
算法·leetcode·职场和发展·动态规划
tigershang2 小时前
卡尔曼滤波:不确定世界中的最优估计
人工智能·算法·机器学习
m0_738120722 小时前
渗透测试基础——PHP 序列化数据结构与反序列化机制详解
android·服务器·网络·数据结构·安全·php