返回
LeetCode 589. N 叉树的前序遍历
见解分享
2023-10-05 01:26:56
引言
在计算机科学中,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 叉树中的节点数。递归方法使用更简洁的代码,而迭代方法更易于理解。最终,选择哪种方法取决于开发者的个人偏好和问题要求。