簡體   English   中英

如何從葉節點的一組路徑片段構建一棵樹

[英]How to build a tree from a set of path fragments for leaf nodes

當唯一的輸入數據是葉節點的路徑決策(以隨機順序)時,我正在尋找一種算法來構建可能的自上而下的樹結構。

如果葉節點已通過該節點,則路徑決策用 [nodeID]+ 標記,如果葉節點未通過該節點,則用 [nodeID]- 標記。 示例輸入:

在此處輸入圖片說明

來自上面示例輸入的一種可能的樹結構是:

在此處輸入圖片說明

輸出應該是節點列表和節點各自的父節點,如下所示:

在此處輸入圖片說明

如您所見,每個葉節點的可能位置不限於一個,因為輸入數據不是完整路徑。 示例中的 Leaf1 可以是節點 D 或節點 I 的子節點。

您可以從任意數量的葉子中獲取路徑數據,但每個葉子只有一行路徑數據。 可能有些葉子根本無法獲得任何數據,並且您不知道樹中總共有多少葉子。 路徑數據中提到的所有節點都應該出現在輸出表中,並且只有計算出的根不應該分配任何父節點。

我想人們必須以某種方式結合來自每個葉子路徑的事實,例如從您知道的 Leaf1 中:A 和 E 不能在平行線上,從 Leaf2 中您知道 A 和 I 不能在平行線上,依此類推.. .

最好使用 javascript,但也歡迎其他語言或偽代碼!

既然沒有人回答,我就說一些片面的想法。

你開始:

1: [A+, E+, H-]
2: [B-, A+, I+, D-]
3: [K+, G+, E+, C-]
4: [H+, A-, G-]

首先,搜索僅帶有 + 的節點。 做那些根。 掃描這個,我們可以對節點EIK 所以我們的回答開始於:

E
E I
I K

我們的路徑數據簡化為:

1: [A+, H-]
2: [B-, A+, D-]
3: [G+, C-]
4: [H+, A-, G-]

現在我們有一個分區操作。 為此,我們制作了一個圖,其中 2 個節點連接,如果它們與 + 一起出現。 然后我們通過連接的組件將節點分開,並將葉子分成有 + 的分區(任何沒有分區的葉子都可以在樹中成為葉子然后丟棄)。 刪除任何 - 由這種分離處理的。 在我們的例子中,這是一個完全斷開的圖,它將每個節點放入自己的分區並將路徑數據分為 3 組(注意,我們丟失了所有 - 分區解釋的規則):

1: [A+]
2: [A+]

3: [G+]

4: [H+]

現在我們解決了每個問題,最終得出了以下解決方案:

E
E I
I K
K A
K B
K C
K D
K G
K H

我相信這種方法只會在沒有樹的情況下無法取得進展。 如果要找到一棵樹,它會找到一棵樹。

暫無
暫無

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

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