DFS序
我们在处理一些树上计数问题时,经常由于数据量过大而树形结构的统计操作又十分复杂,所以常常需要将树形结构转换成更加便于查询和修改的线性结构,再结合树状数组或者线段树等高效的查询更新结构来解决问题,这时,为了将树形结构转换成线性结构,我们经常会用到的一个东西就是DFS序。
想要得到DFS序,只需要对树做一次DFS遍历,在遍历过程中记录每个点被遍历到的时间点,这里用一个(,Orderin,Orderout)时间戳数组来记录,以下面的树为例:
经过DFS后得到的DFS序为:
顶点序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
(Orderin) | 4 | 1 | 5 | 2 | 7 | 6 | 3 |
(Orderout) | 4 | 7 | 5 | 5 | 7 | 7 | 3 |
在(Orderin,Orderout)数组中(序号Orderin[x] = 序号),所以用树状数组或者线段树维护时,只需要针对序号维护就可,如果要查询某个子树,只需要知道子树根节点(x),然后查询序号(Orderin[x] - Orderout[x])的区间值。