簡體   English   中英

如何找到樹的任意兩個頂點之間的邊或頂點數量?

[英]How to find the number of edges or vertices between any two vertices of a tree?

它是一棵普通樹(無環圖),因此只能有一個這樣的路徑。 我可以使用哪種算法?

編輯:

需要找到樹中所有頂點對的路徑

我想在這里擴展@templatetypedef的答案1

請注意,在您的問題中,您需要對樹中的每對節點至少執行一次寫入操作。 其中有n*(n-1)/2個。
因此,就O表示法而言,您找不到比O(n^2)更好的算法。

現在,使用DFSBFS查找每個節點的路徑。 它將在O(n+m)n個頂點, m邊)中運行。 但是由於它是一棵樹,我們知道m=n-1 ,對於BFS / DFS給我們O(n) 請注意,在某個節點v的單個BFS / DFS中,每個節點u都得到d(v,u)

如果對每個節點重復此操作,它將得到O(n^2) -就大O表示法而言,這是最佳選擇。 我同意您可能會通過一些優化獲得更好的常量,但是僅此而已。


(1)以評論開頭,但是它太長了,我認為它值得回答。

一個簡單的選擇是從一個節點開始進行深度優先搜索,直到到達另一個節點為止。 然后,您可以查看從第一個節點到第二個節點的路徑,該路徑必須是這些節點之間的唯一路徑,然后計算該路徑中有多少條邊。 這以線性時間運行,因為樹上的DFS僅占用線性時間。

希望這可以幫助!

您需要找到最低公共祖先 (LCA)。 您可以在此處研究不同的方法: http : //leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-tree-part-i.html

由於我不喜歡遞歸,因此我使用了休閑解決方案,因為您需要以有效的方式查找所有對,所以該方法更適合您的問題。

在此處輸入圖片說明

1-)在A-> B之間尋找路徑:-從節點A開始迭代,沿着每個父節點向上標記每個A標記,直到父根基金為止。 -從節點B開始迭代,直到找到A標志。 您已找到LCA節點。 -結果路徑是從A到LCA節點的列表,以及從B到LCA節點的反向列表。

2-)改進發現A-> B:-同時迭代兩個節點,分別用A標志和B標志標記每個祖先節點。 直到A迭代找到B標志或B迭代找到A標志。 然后第一個找到另一個節點標志的人找到了LCA節點。

3-)查找所有線對路徑:您可以簡單地對每個線對使用上述解決方案。 或者嘗試考慮進行第一遍遍歷所有樹以創建標志列表的過程,然后進行第二遍遍以識別每對樹的所有LCA節點,這在節點的樹數太大時會很不方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM