返回

LeetCode 589. N 叉树的前序遍历

见解分享

引言

在计算机科学中,N 叉树是一种数据结构,其中每个节点可以拥有任意数量的子节点。前序遍历是一种遍历 N 叉树的算法,其中根节点首先被访问,然后是它的子节点,再是它们的子节点,依此类推。

题目

LeetCode 589. N 叉树的前序遍历要求我们实现一个函数来返回 N 叉树的前序遍历结果。给定一个 N 叉树的根节点,我们必须返回该树的前序遍历顺序中的节点值列表。

解决方案

我们可以使用两种主要方法来解决此问题:

1. 递归方法

递归方法遵循分而治之的原则。算法如下:

/**
 * Definition for Node.
 * class Node {
 *     public $val;
 *     public $children;
 *     function __construct($val) { $this->val = $val; $this->children = []; }
 * }
 */

function preorder($root) {
    if (!$root) {
        return [];
    }

    $result = [$root->val];
    foreach ($root->children as $child) {
        $result = array_merge($result, preorder($child));
    }

    return $result;
}

2. 迭代方法

迭代方法使用栈来跟踪要访问的节点。算法如下:

function preorder($root) {
    if (!$root) {
        return [];
    }

    $stack = [$root];
    $result = [];

    while (!empty($stack)) {
        $node = array_pop($stack);
        $result[] = $node->val;

        foreach (array_reverse($node->children) as $child) {
            array_push($stack, $child);
        }
    }

    return $result;
}

示例

考虑以下 N 叉树:

     1
   / | \
  2  3  4
 / \
5   6

递归方法:

  • 从根节点 1 开始,将 1 添加到结果中。
  • 遍历子节点 2、3、4。
  • 对于子节点 2,将 2 添加到结果中,然后遍历其子节点 5 和 6。
  • 对于子节点 5,将其添加到结果中。
  • 对于子节点 6,将其添加到结果中。
  • 对于子节点 3 和 4,重复上述步骤。

结果: [1, 2, 5, 6, 3, 4]

迭代方法:

  • 将根节点 1 压入栈中。
  • 循环,直到栈为空。
  • 弹出栈顶元素(1)并将其添加到结果中。
  • 将其子节点 4、3、2 反向压入栈中。
  • 弹出栈顶元素(2)并将其添加到结果中。
  • 将其子节点 6、5 反向压入栈中。
  • 依次弹出栈顶元素(5、6、3、4)并将其添加到结果中。

结果: [1, 2, 5, 6, 3, 4]

结论

两种方法都可以在时间复杂度 O(n) 和空间复杂度 O(n) 内完成,其中 n 是 N 叉树中的节点数。递归方法使用更简洁的代码,而迭代方法更易于理解。最终,选择哪种方法取决于开发者的个人偏好和问题要求。