目录

  1. 树的存储
    vector
    前向星
    直接 双关键字计数排序 所有边

  2. 树的DFS
    如果爆栈需要BFS

  3. 父亲节点,深度,子树大小,树形DP(直径)

  4. LCA

  5. DFS序列,和树状数组/线段树

  6. 树链剖分(和线段树),LCT(和Splay)

其他的树
二叉树
字典树
并查集

Prüfer序列

最小生成树

定义

如果一个无向简单图GG满足以下相互等价的条件之一,那么GG是一棵树:

  1. GG是没有回路的连通图。
  2. GG没有回路,但是在GG内添加任意一条边,就会形成一个回路。
  3. GG内的任意两个顶点能被唯一路径所连通。

如果无向简单图GG有有限个顶点(设为nn个顶点),那么GG是一棵树还等价于:

  1. GG是连通的,有n1n - 1条边,并且GG没有简单回路。

性质

一棵树中每两个点之间都有且只有一条路径(指没有重复边的路径)。一颗有N个点的树有N-1条边,也就是连接N个点所需要的最少边数。所以如果去掉树中的一条边,树就会不连通。

如果在一棵树中加入任意的一条边,就会得到有且只有一个环的图。这是因为这条边连接的两个点(或是一个点)中有且只有一条路径,这条路径和新加的边连在一起就是一个环。如果把一个连通图中的多余边全部删除,所构成的树叫做这个图的生成树。

如果要在树中加入一个点,就要加入一条这个点和原有的点相连的边。这条边不会给这棵树增加一个环或者多余的路径。所以每次这样加入一个点,就可以构成一棵树。

一棵树既可以是有向的也可以是无向的。显然,树是连通图,但不会是双连通图(对于无向图)或者强连通图(对于有向图)。树可以算是稀疏图。

显然树中也没有自环和重复边。

存储

树的父亲表示法

对于普通的树,可以像图一样为每一个点存储一个边表(通常按顺序存和每一个点的关系的叫做邻接矩阵,存具体的边的叫做邻接表),或者直接存储所有边的边表等。由于树是稀疏图,所以一般不用邻接矩阵存储。对于有根树,如果用为每一个点储存一个边表的方法,由于每一棵树都只有一个父节点,所以通常指向父节点的边不存在这个表中。同时如果子节点是没有顺序的,也是因为一个节点的子节点不会同时是其他节点的子节点,也可以把子节点直接当成存边的链表的节点,这时候每个节点只需要储存两个指针,所以这种存储方法有时候也会被叫做多叉树转二叉树。

对于子节点是有顺序的有根树,每条边都可以以固定的位置分别储存。对于完全二叉树甚至能直接用一个数组访问所有节点,不另外储存边的信息。有的树可以被设计成固定的从根节点开始访问,这时候可以不储存父节点。同样的,有的树也可以省略子节点,例如并查集。

树的遍历

对于一般的树,可以用和普通的图一样的方法遍历,比如深度优先搜索和宽度优先搜索。如果和树的每个节点相邻的点有固定的顺序,深度优先搜索可以不储存当前点以外的任何信息,而且不用判重。而在有根树中更方便,所以有根树中很少使用宽度优先搜索。

对于有根树的从根开始的深度优先搜索遍历,有三种特定的顺序:

注意对于每一种遍历,事实上都得先访问根节点,这里的遍历顺序是指处理节点中的数据的顺序。已知中序遍历和任一其他遍历的情况下,可以还原一个二叉树。一个直观的方法是按前序或者反转的后序插入一个按中序排序的搜索树。已知前序和中序也可以还原一棵树,但是不能知道二叉树中一个节点唯一的子树是在左边还是右边。

事实上也可以把左右的顺序反过来。这些由根开始的遍历方法也适用于特定的一个子树。

森林

森林比树少一个条件,指没有回路的图。也就是说,森林可能是不连通的,边数可能比树还少,就是说小于顶点数。

森林也可以看成是好多棵互不相连的非空的树,只有一棵树也可以算是森林。不过森林不一定是一棵树。

森林也可以是有根的,这时候森林中的每一棵树都有一个根。

一棵树去掉若干条边也会成为森林,这时候可以看成一棵树分成了好多棵树。森林中的两棵树之间加一条边,也可以把这两棵树合在一起,最终合成一棵树。

很多地方用森林,都是用来表示很多棵树,包括作为逻辑结构、数据结构的时候等。有一种重要的数据结构并查集就是一个有根的森林,可以很快的判断两个元素是不是属于同一个互相独立的集合,以及合并两个集合等。

其他介绍

父亲节点(parent):一个节点到根节点路径上第二个节点

祖先节点(ancestor):一个节点到根节点路径上的节点

二叉树

二叉树是一种特殊的树,甚至一些定义和传统的树有矛盾。

完全二叉树

满二叉树

DFS/BFS

我们可以通过DFS计算出一个树中所有点的深度。

LCA

树DFS序

树链剖分

动态树

树的直径

树的重心

3个等价的定义
1. 删掉自己之后,最大的子树最小
2. 删掉自己之后,最大的子树<=n/2
4. 重心到所有点的距离之和最小

https://en.wikipedia.org/wiki/Tree_(graph_theory)

参考题目

P2052
P2420

    1. 目录
    2. 定义
    3. 性质
    4. 存储
    5. 树的遍历
    6. 森林
    7. 其他介绍
    8. 二叉树
    9. DFS/BFS
    10. LCA
    11. 树DFS序
    12. 树链剖分
    13. 动态树
    14. 树的直径
    15. 树的重心
    16. 参考题目