树学习笔记

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 前序遍历

算法流程:

  1. 输出当前节点 <=

  2. 遍历左子树

  3. 遍历右子树

可以理解为在每个节点 左边 添加一个 触发点
当遍历到该触发点时 输出当前节点

前序遍历 “触发点” 理解示意图

前序遍历

3.2 中序遍历

算法流程:

  1. 遍历左子树

  2. 输出当前节点 <=

  3. 遍历右子树

可以理解为在每个节点 下方 添加一个 触发点
当遍历到该触发点时 输出当前节点

中序遍历 “触发点” 理解示意图

中序遍历

3.3 后序遍历

算法流程:

  1. 遍历左子树

  2. 遍历右子树

  3. 输出当前节点 <=

可以理解为在每个节点 右边 添加一个 触发点
当遍历到该触发点时 输出当前节点

后序遍历 “触发点” 理解示意图

后序遍历

4. 二叉查找树

4.1 二叉查找树的查找

算法流程:

  1. 读取当前节点

    1. 是查找目标:返回
    2. 不是目标:继续
  2. 比较目标和当前节点

    1. 目标 小于 当前节点:查找 左子树
    2. 目标 大于 当前节点:查找 右子树

二叉查找树的查找示意图

二叉查找树的查找

4.2 二叉查找树的插入

算法流程:

  1. 插入的数据比当前节点

    1. 当前节点右子树为空:将新数据 直接 插到 右子节点 的位置
    2. 当前节点右子树不为空:遍历 右子树
  2. 插入的数据比当前节点

    1. 当前节点左子树为空:将新数据 直接 插到 左子节点 的位置
    2. 当前节点左子树不为空:遍历 左子树

二叉查找树的插入

二叉查找树的插入
posted @ 2026-08-21 08:00  Sail-With-Dawn  阅读(9)  评论(0)    收藏  举报