树的欧拉序和dfs序

dfs序和欧拉序:

参考博客 https://www.cnblogs.com/pealicx/p/6859901.html

dfs序:

  构建方式:在进出每个节点时将其加入序列。

  例:如下图

            

    该序列为:

      1    2   3   3   4   4   5   5   2   6   7   7   8   8   6   1

      进  进  进  出  进  出  进  出  出  进  进  出  进  出  出  出

  应用:

    1.求某个点到根节点的权值和。方法是:需要在进的点处做加法,出的点处做减法,查询某点就只需要查询对应的前缀即可。

    2.求某个子树的权值和。方法是:需要在进的点处做加法,用某个点最后一次出现的位置的前缀和减去第一次出现的位置的前一个位置的前缀和即可。

欧拉序:

  构建方式:只要到达每一个结点就把他加进序列。

  例:如上图:

    该序列为:

      1   2   3   2   4   2   5   2   1   6   7   6   8   6   1

  应用:

    1.求两点间的$LCA$。在这两点间的区间中,深度最小的即为$LCA$,用$RMQ$即可。

    2.求某个子树的权值和,方法是:只记录第一次出现的数的值,同样的查询某点就只需要查询该点在欧拉序中最后出现的位置的前缀即可减去第一次出现的位置-1的前缀和即可。

    3.换根操作:这种欧拉序相当于以根为起点围着树跑了一圈,那么我们就可以把欧拉序写成一个环

        以某个点为跟的欧拉序就是以某个点在欧拉序中第一次出现的位置为起点向前走$(2*n-1)$步。

posted @ 2019-10-02 15:12  Toot_Holmes  阅读(314)  评论(0)    收藏  举报