樹的prufer編碼


prufer是無根樹的一種編碼方式,一棵無根樹和一個prufer編碼唯一對應,也就是一棵樹有唯一的prufer編碼,而一個prufer編碼對應一棵唯一的樹。

第一部分:樹編碼成prufer序列。

樹編碼成prufer序列的方式是:prufer序列初始為空。每次從樹上選出一個編號最小的葉子節點,然后將與該葉子節點相鄰的那個節點的編號寫入prufer序列的末尾,之后從樹上刪掉這個葉子節點。循環這個步驟n-2次,最后得到一個長度為n-2的prufer序列(此時樹中只有一條邊,我們就不管它了)。

我們以下面這個樹為例。



step1:編號最小的葉子節點為3,將與其相連的節點1加到prufer的末尾,並將3從樹上刪掉,此時prufer序列為(1),樹變為如下:

step2:編號最小的葉子節點為1,將與其相連的節點2加到prufer末尾,此時prufer序列為(1,2),並將節點1刪掉,樹變為如下:

step3:編號最小的葉子節點為4,將與其相連的節點2加入到prufer的末尾,此時prufer序列為(1,2,2),並將節點4刪掉,樹變為如下:

此時,結束,我們得到了prufer序列為(1,2,2)。



第二部分:由prufer序列得到樹。首先,將每個節點的度數設為1加上該節點在prufer序列中出現的次數。然后以下循環執行n-2次。第i次循環,選擇此時度數為1的編號最小的節點u,將其與此時prufer序列的第i個元素v連邊,然后將u和v的度數都減去1。這n-2次執行完之后,僅剩下兩個節點他們的度數都是1,將這兩個點連邊,這樣就得到一個有n-1條邊的樹。

下面,我們以上面的prufer序列為例還原這個樹。初始的prufer為(1,2,2),初始的度數為:

step1:選擇度數為1的最小編號的節點3與prufer的第一個元素1連邊,並將3和1的度數都減去1,得到樹和新的度數:

 

step2:選擇度數為1的最小節點1和prufer中的第二個元素2連邊,並將1和2的度數都減去1,得到樹和新的度數:


step3:選擇度數為1的最小節點4和prufer中的第三個元素2連邊,並將4和2的度數都減去1,得到樹和新的度數:


最后,將僅有的度數為1的兩個節點2和5,連邊,得到:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM