【开发】 - 树
作为一个联想能力较差的学渣,没有举例实际应用的学习总是很快就忘,树的应用就是如此,所以总结一下树的应用还是很有必要的。
1. 层序遍历(BFS)
特点:按层级从上到下、从左到右访问节点。
应用场景:
场景加载与分层渲染
在游戏场景中,地图或场景可能分为多层(如背景层、角色层、特效层)。通过层序遍历,可以逐层加载或渲染对象,确保层级逻辑正确。
示例:1
2
3
4
5
6二叉树结构表示场景层级:
场景根节点
/ \
背景层 角色层
/ \ / \
背景1 背景2 角色A 角色B层序遍历顺序:场景根节点 → 背景层、角色层 → 背景1、背景2、角色A、角色B。
用途:确保先加载场景根节点,再逐层加载背景和角色,避免渲染顺序混乱。敌人生成与波次控制
在RPG或塔防游戏中,敌人可能分波次生成。层序遍历可用于逐层生成敌人,先生成第一波敌人(顶层节点),再生成后续波次(下一层节点)。
示例:1
2
3
4
5
6二叉树结构表示敌人波次:
波次1
/ \
波次2 波次3
/ \ / \
波次4 波次5 波次6 波次7层序遍历顺序:波次1 → 波次2、波次3 → 波次4、波次5、波次6、波次7。
用途:按层级控制敌人生成节奏,确保游戏难度逐步提升。资源管理与依赖加载
游戏资源(如纹理、模型)可能有依赖关系。层序遍历可按层级加载资源,先加载父资源,再加载子资源。
示例:1
2
3
4
5
6二叉树结构表示资源依赖:
场景资源
/ \
角色模型 背景纹理
/ \ / \
动画1 动画2 纹理A 纹理B层序遍历顺序:场景资源 → 角色模型、背景纹理 → 动画1、动画2、纹理A、纹理B。
用途:确保父资源加载完成后再加载子资源,避免资源缺失导致的错误。
2. 前序遍历(根-左-右)
特点:先访问根节点,再递归处理子节点。
应用场景:
游戏数据保存与恢复
在保存游戏进度时,需要递归保存每个节点的状态。前序遍历可以按“父节点先于子节点”的顺序保存数据,确保父子关系正确。
示例:1
2
3
4
5
6二叉树结构表示玩家技能树:
技能A
/ \
技能B 技能C
/ \ / \
技能D 技能E 技能F 技能G前序遍历顺序:技能A → 技能B → 技能D → 技能E → 技能C → 技能F → 技能G。
用途:保存技能树时,先保存父技能,再保存子技能,避免技能依赖丢失。场景构建与初始化
游戏场景初始化时,可能需要先创建父对象(如场景根节点),再依次创建子对象(如角色、道具)。
示例:1
2
3
4
5
6二叉树结构表示场景对象:
场景根
/ \
角色组 道具组
/ \ / \
角色1 角色2 道具A 道具B前序遍历顺序:场景根 → 角色组 → 角色1 → 角色2 → 道具组 → 道具A → 道具B。
用途:按层级初始化场景对象,确保父对象存在后再创建子对象。AI行为树的执行顺序
在行为树中,父节点的条件可能需要先被评估,再执行子节点的行为。前序遍历可满足这种逻辑。
示例:1
2
3
4
5
6二叉树结构表示AI行为:
检查敌人
/ \
追逐敌人 攻击敌人
/ \ / \
移动 回避 普通攻击 特殊攻击前序遍历顺序:检查敌人 → 追逐敌人 → 移动 → 回避 → 攻击敌人 → 普通攻击 → 特殊攻击。
用途:先评估是否检测到敌人,再决定后续行为。
3. 中序遍历(左-根-右)
特点:先遍历左子树,再访问根节点,最后遍历右子树。
应用场景:
排序与查找
如果二叉树是二叉搜索树(BST),中序遍历会得到有序序列。在游戏开发中,可用于排序玩家积分、物品价格等。
示例:1
2
3
4
5
6二叉搜索树表示玩家积分:
80
/ \
60 100
/ \ / \
50 70 90 110中序遍历结果:50 → 60 → 70 → 80 → 90 → 100 → 110。
用途:快速生成玩家积分排行榜,或查找特定分数段的玩家。物品栏管理
玩家背包中的物品可能需要按名称或类别排序。中序遍历可生成有序列表,方便查找。
示例:1
2
3
4
5
6二叉树结构表示物品栏:
防具
/ \
武器 消耗品
/ \ / \
剑 斧 药水 食物中序遍历顺序:剑 → 武器 → 斧 → 防具 → 药水 → 消耗品 → 食物。
用途:生成按类别排序的物品列表,方便玩家浏览。动态路径规划
在迷宫或地图中,中序遍历可用于生成特定顺序的路径,例如先探索左侧区域,再回到根节点,最后探索右侧区域。
示例:1
2
3
4
5
6二叉树结构表示地图区域:
中心区域
/ \
左侧区域 右侧区域
/ \ / \
A区 B区 C区 D区中序遍历顺序:A区 → 左侧区域 → B区 → 中心区域 → C区 → 右侧区域 → D区。
用途:按特定顺序探索地图区域,确保覆盖所有区域。
4. 后序遍历(左-右-根)
特点:先遍历子节点,再访问根节点。
应用场景:
资源释放与销毁
在关闭游戏场景或销毁对象时,需先释放子节点资源,最后释放父节点。
示例:1
2
3
4
5
6二叉树结构表示场景对象:
场景根
/ \
角色组 道具组
/ \ / \
角色1 角色2 道具A 道具B后序遍历顺序:角色1 → 角色2 → 角色组 → 道具A → 道具B → 道具组 → 场景根。
用途:先销毁角色和道具,再销毁父节点,避免引用失效导致的错误。计算子树属性
在游戏中,可能需要计算某个节点的子树属性(如总攻击力、总生命值)。后序遍历可确保先计算子节点,再汇总到父节点。
示例:1
2
3
4
5
6二叉树结构表示角色属性:
总攻击力
/ \
近战伤害 法术伤害
/ \ / \
剑术 斧击 火球 冰霜后序遍历顺序:剑术 → 斧击 → 近战伤害 → 火球 → 冰霜 → 法术伤害 → 总攻击力。
用途:先计算近战和法术伤害的子节点,再汇总总攻击力。场景清理与回收
在游戏关卡结束时,需清理所有对象(如敌人、道具)。后序遍历可逐层清理,确保子对象先被处理。
示例:1
2
3
4
5
6二叉树结构表示关卡对象:
关卡1
/ \
敌人组 道具组
/ \ / \
敌人A 敌人B 道具C 道具D后序遍历顺序:敌人A → 敌人B → 敌人组 → 道具C → 道具D → 道具组 → 关卡1。
用途:先清理敌人和道具,再清理关卡,避免残留对象影响后续逻辑。
总结
| 遍历方式 | 特点 | 游戏开发典型场景 |
|---|---|---|
| 层序遍历 | 按层级访问 | 场景分层渲染、敌人波次生成、资源加载 |
| 前序遍历 | 根节点优先 | 数据保存、场景初始化、AI行为树 |
| 中序遍历 | 左-根-右 | 排序与查找(积分、物品)、路径规划 |
| 后序遍历 | 子节点优先 | 资源释放、子树属性计算、场景清理 |
二叉树代码
1 |
|
1 | using System; |
1 | class BinaryTreeNode { |
1 | -- 二叉树节点 |
- 标题: 【开发】 - 树
- 作者: 宋
- 创建于 : 2025-07-31 00:19:07
- 更新于 : 2025-07-31 00:39:28
- 链接: https://sxl-space.tk/2025/07/31/007_Tree/
- 版权声明: 版权所有 © 宋,禁止转载。