oi-wiki
Version:
wiki for OI / ACM-ICPC
133 lines (67 loc) • 2.16 kB
Markdown
算法竞赛的树和现实生活中的树长得一样,只不过我们习惯于处理问题的时候把树根放到上方来考虑。
这种数据结构看起来像是一个倒挂的树,因此得名。
形式化的定义:
- 有 $n$ 个节点, $n-1$ 条边的连通无向图
- 无向无环连通图
- 任意两个节点之间有且仅有一条简单路径的无向图
# 有关树的定义
## 森林
每个连通分量(连通块)都是树的图
## 生成树
一个图的生成子图,同时要求是树。
## 有根树
指定了一个点是根的树
## 无根树
没有指定一个根节点的树
## 深度
### 节点的深度
到根节点的距离(最短路径的长度)
### 树的深度
所有节点的深度的最大值
## 父亲
一个节点到根节点的路径上的第二个节点
## 祖先
一个节点到根节点的路径上,除了它本身外的所有节点
## 子节点
如果 $u$ 是 $v$ 的父亲,那么 $v$ 是 $u$ 的子节点。
## 兄弟
同一个父亲的多个子节点互为兄弟
## 后代(子孙)
子节点和子节点的后代
或者理解成:如果 $u$ 是 $v$ 的祖先,那么 $v$ 是 $u$ 的后代。
## 度数
### 无根树
和一个点相关的边的个数
### 有根树
子节点个数
## 叶节点
### 无根树
度数不超过 $1$ 的节点
??? question " 为什么不是度为 $1$?"
考虑 $n = 1$ 的时候。
### 有根树
没有子节点(度数为 $0$)的节点
## 子树
删掉与父亲相连的边后,该节点所在的子图
# 特殊的树
## 只有一个节点
没有边
n = 1, m = 0$
## 链
点 $i$ 的父亲为 $i - 1$。
树的深度为$n - i$。
## 菊花
所有非根节点的父亲均为根节点。
树的深度为 $1$。
## 二叉树
每个节点最多只有两个儿子(子节点)的树
### 满二叉树
### 完全二叉树
这里好像需要有图。(图待补)
# 如何存树
## 存父亲
用一个数组记录每个节点的父亲节点:`fa`数组
## 邻接表
当成图来存
有根树:`vector<int> childs[n], fa[n]`
二叉树:`int lch[n], rch[n], fa[n]`