首頁  >  文章  >  後端開發  >  如何從路徑字串清單建構層次樹結構?

如何從路徑字串清單建構層次樹結構?

Barbara Streisand
Barbara Streisand原創
2024-10-31 00:15:29905瀏覽

How to Build a Hierarchical Tree Structure from a List of Path Strings?

將路徑結構轉換為樹

從路徑字串集合中開發嵌套資料結構可能會帶來挑戰,特別是在處理指針和遞歸。讓我們研究一個從路徑結構陣列建立層次樹的解決方案。

考慮以下範例:

s:=[]string {
  "a/b/c",
  "a/b/g",
  "a/d"
}

我們的目標是建構一個類似於以下JSON 結構的樹:

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

為了實現這一點,我們實現了一個名為AddToTree 的遞歸函數,它採用現有的樹和路徑段列表。

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
}

此函數遍歷現有的樹以確定是否指定的節點已經存在。如果是,它將繼續到路徑的下一段。否則,它會建立一個具有指定名稱的新節點並將其附加到現有樹中。

Example output (note that I used omitempty on the children field, because I don't like null entries in my JSONs):

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

我們的解決方案在以下關鍵方面與原始方法不同:

  • 它對節點列表而不是單個節點的子節點進行操作。
  • 它建立新節點而不是重複使用現有節點,從而防止重複。
  • 它檢查樹中的現有節點,確保每個節點僅添加一次。

以上是如何從路徑字串清單建構層次樹結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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