參考文章:【http://blog.163.com/gc_chdch@126/blog/static/172279052201639103637601/】
樹的歐拉序是對樹進行DFS的一種序列。有兩種形式:1、在每個結點進和出都加進序列。2、只要到達每一個結點就把他加進序列。
例如:給出一棵樹:
第一種方法得到的序列和對應的進出狀態分別是:
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、換根操作:這種歐拉序相當於以根為起點圍着樹跑了一圈,那么我們就可以把歐拉序寫成一個環就是:
1 2 3 2 4 2 5 2 1 6 7 6 8 6 1 2 3 2 4 2 5 2 1 6 7 6 8 6
以某個點為跟的歐拉序就是以某個點在上面的歐拉序中第一次出現的位置為起點向前走(2*n-1)步,例如以4為根的歐拉序就是
1 2 3 2 4 2 5 2 1 6 7 6 8 6 1 2 3 2 4 2 5 2 1 6 7 6 8 6
L-------------------------------------------------R//以4為跟的歐拉序,同時可以維護和之類的東西。