パス文字列のリストをツリー状の構造に効率的に変換するにはどうすればよいでしょうか?

Susan Sarandon
リリース: 2024-10-29 02:00:02
オリジナル
395 人が閲覧しました

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>
ログイン後にコピー

このコードは、ツリーを再帰的に作成しようとします。問題点:

  • 入力ノードが常にルート ノードであると想定します。
  • 複製を作成する前にノードが既に存在するかどうかは確認しません。
  • 入力ノードが更新され、ツリー構造が不正になります。

これらの問題に対処するために、修正されたコード サンプルを次に示します。

<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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート