首頁 >後端開發 >Golang >如何從表示檔案系統層次結構的路徑字串陣列有效地建構樹狀結構?

如何從表示檔案系統層次結構的路徑字串陣列有效地建構樹狀結構?

DDD
DDD原創
2024-10-27 00:40:02861瀏覽

How to efficiently construct a tree-like structure from an array of path strings representing a file system hierarchy?

如何從路徑字串陣列建構樹狀結構

簡介:
給定一個表示文件路徑的字串數組,我們的目標是建立反映目錄層次結構的樹狀資料結構。陣列中的每個字串代表從根目錄到特定檔案或目錄的完整路徑。

使用子清單的遞歸方法:
要遞歸地建立樹,我們需要從左到右遍歷路徑字串,將它們分成多個元件。我們可以使用帶有名稱和子節點切片的 Node 結構來表示樹。

<code class="go">type Node struct {
    Name     string
    Children []Node
}</code>

關鍵的見解是對節點清單而不是單一節點的子節點進行操作。這使我們能夠處理具有不同根節點的多棵樹。

<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>
  1. 檢查目前節點清單(根)中是否存在第一個元件(names[0])。
  2. 如果沒有,則將具有此名稱的節點新增至清單。
  3. 在更新的清單上遞歸呼叫 AddToTree,傳遞路徑的其餘元件。

範例:
對於輸入路徑字串:

<code class="go">s := [...]string{"a/b/c", "a/b/g", "a/d"}</code>

函數AddToTree 產生以下樹結構:

<code class="json">{
 "name": "a",
 "children": [
     {
      "name": "b",
      "children": [
        {
         "name": "c"
        },
        {
         "name": "g"
        }
      ]
    },
    {
     "name": "d",
     "children": []
    }
  ]
}</code>

>相對於原始方法的優點:

  1. 對節點清單進行操作,允許具有不同根節點的多棵樹。
  2. 建立新節點而不是重複使用輸入節點,確保樹的每個層級是不同的。
  3. 搜尋樹以防止節點重複。

以上是如何從表示檔案系統層次結構的路徑字串陣列有效地建構樹狀結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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