簡體   English   中英

給定一棵樹,在Log(n)中找到從節點“ a”到節點“ b”的路徑中的第k個節點?

[英]Given a tree, find the kth node in the path from node 'a' to node 'b' in Log(n)?

給定一棵樹,我需要在從“ a”到“ b”的路徑中找到第k個節點。 這意味着我需要在從節點“ a”到節點“ b”的路徑中的“ kth”位置找到該節點。 我在考慮最低共同祖先和/或強光分解的路線,但是我不確定這是否是這樣做的方式。 朝着正確方向的任何指導表示贊賞。

細節:

  • 該樹不是二叉樹。 它是具有n-1個邊,n個頂點且沒有循環的無向圖。 只是你的常規樹
  • 樹的頂點編號為1到n。 有n-1個無向邊連接n-1對這些頂點
  • “ a”和“ b”是樹中從1到n編號的任意2個頂點。 我們將在從“ a”到“ b”的路徑中找到第k個節點。 保證'k'的值<=從'a'到'b'的路徑中的節點數

由於查詢數量很大,因此無法選擇將BFS應用於每個查詢(從“ a”到“ b”的第k個節點)。

做最普通的祖先,並為每個節點保留其深度(到根的距離)。

接下來找出第k個節點在a到lca還是lca到b部分。 深度差是它們之間節點的數量,因此,如果depth[a] - depth[lca] > k則該節點位於lca-b部分。

如果節點在a到lca部分,則只需找到a的第k個祖先。 應該使用您預先計算的LCA數據為log(N)。

如果該節點位於b到lca部分,則可以計算k',它是第k個節點到b的距離( k' = 1 + depth[a] + depth[b] - 2*depth[lca] - k) ),然后獲得b的k'祖先(同樣很容易獲得LCA數據)。

總體而言,所有查找都是logN,其他步驟是恆定的,因此您對每個查詢執行O(LogN)。

暫無
暫無

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

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