树学习笔记
树
1. 树的定义
树是 \(n\) 个节点的有限集合,当 \(n=0\) 时为空树,空树是树的一个特例;当 \(n>0\) 时为非空树。
在 任意一颗非空树 中,满足:
- 有且仅有一个被称为 根 的节点
- 除根节点外的其余节点可分为 \(m\) 个 互不相交的有限集 \(T_1,T_2,...,T_m\) ,其中每一个集合本身又是一棵树,并且称为根的子树
因为 \(T_1,T_2,...,T_m\) 互不相交,所以树 不存在环
树的形式示意图
树相关的术语很多,这里只列举几个 重要 或 常用 的
- 节点:节点包含数据元素及若干指向子树的分支信息
- 子节点:一个节点含有的子树的 根节点 称为该节点的子节点
- 父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点
- 叶节点: 无子树 的节点
- 节点的祖先:从根到该节点经过的 所有 节点
- 节点的子孙:节点的子树中的 所有 节点
- 节点的深度:根节点到这个节点所经历的 边 的个数
- 路径:树中两个节点之间所经过的 节点序列 ,因为树上不存在环,所以 树上路径是唯一的
- 森林:由若干棵 不相交 的树组成的集合
2. 树的存储
常用 孩子表示法 ,类邻接表实现
用 vector 存储当前节点的子节点
实例代码片段
struct Node{ int val; vector <int> ch; }; Node tree[maxn];
3. 树的遍历
3.1 前序遍历
算法流程:
-
输出当前节点 <=
-
遍历左子树
-
遍历右子树
可以理解为在每个节点 左边 添加一个 触发点
当遍历到该触发点时 输出当前节点
前序遍历 “触发点” 理解示意图
![]()
3.2 中序遍历
算法流程:
-
遍历左子树
-
输出当前节点 <=
-
遍历右子树
可以理解为在每个节点 下方 添加一个 触发点
当遍历到该触发点时 输出当前节点
中序遍历 “触发点” 理解示意图
![]()
3.3 后序遍历
算法流程:
-
遍历左子树
-
遍历右子树
-
输出当前节点 <=
可以理解为在每个节点 右边 添加一个 触发点
当遍历到该触发点时 输出当前节点
后序遍历 “触发点” 理解示意图
![]()
4. 二叉查找树
4.1 二叉查找树的查找
算法流程:
-
读取当前节点
- 是查找目标:返回
- 不是目标:继续
-
比较目标和当前节点
- 目标 小于 当前节点:查找 左子树
- 目标 大于 当前节点:查找 右子树
二叉查找树的查找示意图
![]()
4.2 二叉查找树的插入
算法流程:
-
插入的数据比当前节点 大
- 当前节点右子树为空:将新数据 直接 插到 右子节点 的位置
- 当前节点右子树不为空:遍历 右子树
-
插入的数据比当前节点 小
- 当前节点左子树为空:将新数据 直接 插到 左子节点 的位置
- 当前节点左子树不为空:遍历 左子树
二叉查找树的插入



浙公网安备 33010602011771号