樹(shù)的直徑求解方法與證明

1. 問(wèn)題描述

  • 給定一棵樹(shù),求樹(shù)中最長(zhǎng)的路徑的長(zhǎng)度,也就是樹(shù)的直徑;
  • 該樹(shù)的節(jié)點(diǎn)數(shù)為 n,編號(hào)為0, 1, \cdots, n-1 ;
  • 定義樹(shù)中某一個(gè)節(jié)點(diǎn) v 的相鄰節(jié)點(diǎn)為 g[v];

2. 求解方法

  • n 個(gè) 節(jié)點(diǎn)中隨機(jī)選擇一個(gè)節(jié)點(diǎn),假設(shè)為 f;
  • 在樹(shù)中找一條以 f 為起點(diǎn)的最長(zhǎng)路徑;該方法可以用深度優(yōu)先搜索的方法做(詳細(xì)描述見(jiàn)下文[4]);
  • 假設(shè)找到的路徑的另外一個(gè)端點(diǎn)為 s,那么樹(shù)中以 s 為起點(diǎn)的最長(zhǎng)的路徑的長(zhǎng)度便是樹(shù)的直徑

3. 證明

假設(shè)一顆樹(shù)如下圖所示:


樹(shù)

再假設(shè),第一個(gè)節(jié)點(diǎn)選擇的是 節(jié)點(diǎn) 1,以 節(jié)點(diǎn)1 為起點(diǎn)的最長(zhǎng)的路徑是 1 \to 2 \to 3 \to 4 \to \cdots \to 6 。基于上述假設(shè),要證明上述方法正確,即證明:

  • 節(jié)點(diǎn)16 是某條最長(zhǎng)路徑的一個(gè)端點(diǎn)。

要證明上述結(jié)論,假設(shè)某一個(gè)節(jié)點(diǎn) u 是樹(shù)中某一個(gè)最長(zhǎng)路徑的端點(diǎn),該路徑為 l,有如下結(jié)論:

  • 節(jié)點(diǎn) u 不是 2 \to 3 \to \cdots 中的一個(gè)(不包括節(jié)點(diǎn) 6):如果是,那么肯定存在更長(zhǎng)的一條路徑;
  • l1 \to 2 \to \cdots \to 6 重疊一邊,且重疊部分為靠近 節(jié)點(diǎn)6 的那邊,證明方法為:
    • 如果 l1 \to 2 \to \cdots \to 6 完全不相交,那么 l 可能是 7 \to \cdots \to 5 \to \cdots \to 8 這種路徑,此時(shí)可以找到比 l 更長(zhǎng)的路徑。
    • 如果 l1 \to 2 \to \cdots \to 6 相交于某一個(gè)節(jié)點(diǎn),此時(shí)也可以找到比 l 更長(zhǎng)的路徑。

上述例子可以擴(kuò)展成一般的情況。因此,上述結(jié)論成立,從而上述方法正確。

4. 給定某一個(gè)節(jié)點(diǎn)求解樹(shù)中離這個(gè)節(jié)點(diǎn)最遠(yuǎn)的節(jié)點(diǎn)以及對(duì)應(yīng)路徑長(zhǎng)度

使用DFS可以解決這個(gè)問(wèn)題。

定義 dfs(v) 的含義為,返回范圍以 節(jié)點(diǎn) v 為根的子樹(shù)中距離最遠(yuǎn)的節(jié)點(diǎn)以及對(duì)應(yīng)的長(zhǎng)度。

def dfs(v):
  max_dis = 0
  max_node = v
  for u in child(v):
    update_node, update_dis = dfs(u) + 1
    if update > max_dis:
      max_dis = update_dis
      max_node = update_node
  return max_node, max_dis

通過(guò)上述遞歸的方法就可以求出對(duì)應(yīng)的節(jié)點(diǎn),以及具體的距離。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容