ホームページ > バックエンド開発 > Golang > ポインター操作や再帰に大きく依存せずに、パス文字列のリストを階層ツリー構造に効率的に変換するにはどうすればよいでしょうか?

ポインター操作や再帰に大きく依存せずに、パス文字列のリストを階層ツリー構造に効率的に変換するにはどうすればよいでしょうか?

Patricia Arquette
リリース: 2024-10-27 05:06:02
オリジナル
382 人が閲覧しました

How can you efficiently transform a list of path strings into a hierarchical tree structure without relying heavily on pointer manipulation and recursion?

パス文字列の階層ツリー構造への変換

パスのような構造の配列が提示された場合、対応する階層ツリー構造を構築できます。これは、特にポインター操作と再帰に制限がある、困難なタスクです。これに対処するための効率的な解決策は、既存のノードを検索しながら繰り返しノードをツリーに追加する方法を利用することです。

解決策

提案された解決策は再帰的手法を採用しています。 AddToTree という名前の関数。ノードのリスト (ルート) と追加するパス コンポーネントのリスト (名前) を受け取ります。ルート ノードを反復処理して、名前の最初のコンポーネント (names[0]) が子として既に存在するかどうかを確認します。一致しない場合は、names[0] を名前として持つ新しいノードがルートに追加されます。

次に、この関数は、names[0] と一致するノードの子に対して AddToTree を再帰的に呼び出します。このプロセスは、名前のすべてのコンポーネントが処理され、完全に構築されたツリー構造が得られるまで続行されます。

コード例

以下は、AddToTree 関数の Go 実装です。

<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 までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート