首頁 >後端開發 >php教程 >如何有效率地將父子關係轉化為嵌套層次樹?

如何有效率地將父子關係轉化為嵌套層次樹?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-21 04:24:13573瀏覽

How to Efficiently Convert Parent-Child Relationships into Nested Hierarchical Trees?

將父子關係轉換為層次樹

問題:

給定一組父表示層次結構的名稱-父名稱對關係,任務是將它們轉換為最少數量的嵌套樹結構。例如,使用以下輸入:

Child : Parent
    H : G
    F : G
    G : D
    E : D
    A : E
    B : C
    C : E
    D : NULL

預期輸出是一系列分層樹:

D
├── E
│   ├── A
│   │   └── B
│   └── C   
└── G
    ├── F
    └── H

目標是產生嵌套的

    。每個
  • 的元素包含孩子的名字。

    解:

    為了有效地將輸入轉換為分層樹結構,採用了遞歸方法。定義了以下函數:

    function parseTree($tree, $root = null): array
    {
        $return = [];
        foreach ($tree as $child => $parent) {
            if ($parent == $root) {
                unset($tree[$child]);
                $return[] = [
                    'name' => $child,
                    'children' => parseTree($tree, $child),
                ];
            }
        }
        return empty($return) ? null : $return;    
    }
    
    function printTree($tree)
    {
        if (!is_null($tree) && count($tree) > 0) {
            echo '<ul>';
            foreach ($tree as $node) {
                echo '<li>'.$node['name'];
                printTree($node['children']);
                echo '</li>';
            }
            echo '</ul>';
        }
    }

    用法:

    $result = parseTree($tree);
    printTree($result);

    此方法首先解析輸入,以陣列格式建立分層樹結構。隨後,它遍歷樹,產生所需的嵌套

      組合函數:

      為了更有效地實現,可以創建兩個函數的組合版本:

    function parseAndPrintTree($root, $tree)
    {
        if (!is_null($tree) && count($tree) > 0) {
            echo '<ul>';
            foreach ($tree as $child => $parent) {
                if ($parent == $root) {                    
                    unset($tree[$child]);
                    echo '<li>'.$child;
                    parseAndPrintTree($child, $tree);
                    echo '</li>';
                }
            }
            echo '</ul>';
        }
    }

以上是如何有效率地將父子關係轉化為嵌套層次樹?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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