首頁  >  文章  >  後端開發  >  如何有效地將路徑字串清單轉換為樹狀結構?

如何有效地將路徑字串清單轉換為樹狀結構?

Susan Sarandon
Susan Sarandon原創
2024-10-29 02:00:02309瀏覽

How Can You Efficiently Convert a List of Path Strings into a Tree-like Structure?

從路徑字串建立樹狀結構

將字串路徑陣列轉換為樹狀結構可能具有挑戰性,尤其是在處理具有遞歸資料。這是解決該問題的有效方法:

給定的路徑數組由表示樹中節點路徑的字串組成。所需的輸出是具有節點及其子節點的分層樹結構。

首先,讓我們檢查提供的程式碼:

<code class="go">func appendChild(root Node, children []string) Node {
   if len(children) == 1 {
      return Node{children[0], nil}
   } else {
      t := root
      t.Name=children[0]
      t.Children = append(t.Children, appendChild(root, children[1:]))
      return t
   }
}</code>

此程式碼嘗試遞歸建立樹,nhưng 它有一些問題:

  • 它假設輸入節點始終是根節點。
  • 在建立副本之前不會檢查節點是否已存在。
  • 它更新輸入節點,導致不正確的樹狀結構。

為了解決這些問題,這裡有一個修改後的程式碼範例:

<code class="go">func AddToTree(root []Node, names []string) []Node {
    if len(names) > 0 {
        var i int
        for i = 0; i < len(root); i++ {
            if root[i].Name == names[0] { //already in tree
                break
            }
        }
        if i == len(root) {
            root = append(root, Node{Name: names[0]})
        }
        root[i].Children = AddToTree(root[i].Children, names[1:])
    }
    return root
}</code>

此程式碼對節點清單進行操作,而不是單一節點的子節點。它在插入節點之前檢查節點是否已存在,並建立新節點而不是重複使用輸入節點。此外,它還可以根據需要透過附加到根節點列表來處理給定路徑不從同一根節點開始的情況。

範例輸出:

[{
    "name": "a",
    "children": [{
        "name": "b",
        "children": [{
            "name": "c"
        }, {
            "name": "g"
        }]
    }, {
        "name": "d"
    }]
}]

這改善了解決方案提供了從路徑字串到分層樹結構的高效且準確的轉換。

以上是如何有效地將路徑字串清單轉換為樹狀結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn