當從樹中移除頂點及其入射邊緣時,將保留一組 子樹。編寫一個算法,給定一個包含n個頂點的樹的圖,找到一個頂點v,該頂點的移除不會留下具有多於n/2個頂點的子樹。頂點從樹上移除的算法
我已經嘗試過使用修改後的DFS方法以及橋接查找算法的問題。任何幫助將非常感激。
當從樹中移除頂點及其入射邊緣時,將保留一組 子樹。編寫一個算法,給定一個包含n個頂點的樹的圖,找到一個頂點v,該頂點的移除不會留下具有多於n/2個頂點的子樹。頂點從樹上移除的算法
我已經嘗試過使用修改後的DFS方法以及橋接查找算法的問題。任何幫助將非常感激。
創建一個遞歸函數,該函數執行樹的post-order traversal。
該函數返回子樹的大小和頂點,或者頂點可以是全局的(在這種情況下,您只需設置它而不是返回它)。
調用根的函數。
在每個子樹的子樹上調用該函數。
如果其中一個調用返回了一個頂點,則返回該頂點。
返回當前的頂點,如果這些條件成立:
每個孩子的子樹具有小於或等於n/2
頂點。
子樹的子樹大小總和大於或等於(n-1)/2
,即子樹'當前'小於或等於n/2
節點。
返回子樹的大小+ 1作爲子樹大小的總和。
運行時間:O(n)
。我假設你已經有樹的大小 - n
- 如果不是,你需要開始另一個遍歷來獲得這個大小(這不會影響O(n)
運行時間)。
你需要爲每一個可能的根做到這一點,儘管直接的方法。或者您至少需要兩次遍歷,第二次使用附加參數指示從 –
@NiklasB以上連接到頂點的子樹大小。如果您擁有樹大小,那麼這不是必需的 - 上述子樹的大小由子樹的大小隱式定義。如果您沒有樹的大小,我添加了一條關於需要做另一個遍歷的註釋。 – Dukeling
你說得對,我錯過了 –
什麼是你的嘗試不足? –
確定地證明沒有子樹具有多於n/2個頂點。 – user3474076