首页 >后端开发 >Golang >如何有效地将路径字符串列表转换为树状结构?

如何有效地将路径字符串列表转换为树状结构?

Susan Sarandon
Susan Sarandon原创
2024-10-29 02:00:02403浏览

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