将N叉树的层序遍历,以优美的文字呈献
2023-12-12 07:46:54
LeetCode算法学习之--Tree--N叉树的层序遍历
文章正文
问题的由来
在计算机科学领域,树状结构无处不在。从文件系统到网络路由,再到人工智能中的决策树,树结构都扮演着不可或缺的角色。
今天,我们要探讨的是LeetCode算法题429:N叉树的层序遍历。这道题要求我们遍历一棵N叉树,并将每一层的节点值从左到右输出。
N叉树与普通的二叉树不同,它的每个节点可以拥有多个子节点。这使得N叉树的遍历算法略显复杂。
解法一:递归
递归是一种经典的树形结构遍历算法。它的基本思想是:从根节点开始,依次访问其所有子节点。当所有子节点访问完毕后,再返回到父节点,继续访问其兄弟节点。
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> result = new ArrayList<>();
levelHelper(root, 0, result);
return result;
}
private void levelHelper(Node root, int level, List<List<Integer>> result) {
if (root == null) {
return;
}
if (level == result.size()) {
result.add(new ArrayList<>());
}
result.get(level).add(root.val);
for (Node child : root.children) {
levelHelper(child, level + 1, result);
}
}
上述Java代码实现了递归解法。首先,我们创建一个结果列表result来存储每一层的节点值。然后,调用levelHelper()方法从根节点开始遍历N叉树。
在levelHelper()方法中,我们首先判断root节点是否为空。如果为空,则直接返回。然后,我们检查result列表中是否已经存在与当前层level对应的列表。如果没有,则创建一个新的列表并将其添加到result列表中。
接下来,我们将当前节点的值添加到result列表中。最后,我们遍历当前节点的所有子节点,并对每个子节点调用levelHelper()方法,继续进行递归遍历。
解法二:迭代
迭代是另一种遍历树形结构的常用算法。它的基本思想是:使用队列或栈等数据结构来存储要访问的节点,然后依次访问这些节点。
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> level = new ArrayList<>();
for (int i = 0; i < size; i++) {
Node node = queue.poll();
level.add(node.val);
for (Node child : node.children) {
if (child != null) {
queue.offer(child);
}
}
}
result.add(level);
}
return result;
}
上述Java代码实现了迭代解法。首先,我们创建一个结果列表result来存储每一层的节点值。然后,我们创建一个队列queue,并将根节点root入队。
接着,我们进入一个while循环,不断从队列中取出节点并对其进行处理。在每次循环中,我们首先获取队列的长度size,然后创建一个新的列表level来存储当前层的节点值。
接下来,我们遍历队列中的size个节点,并将每个节点的值添加到level列表中。同时,我们将每个节点的子节点入队。
当所有节点都处理完毕后,我们将level列表添加到result列表中。最后,我们返回result列表。
总结
N叉树的层序遍历算法是LeetCode中一道中等难度的题目。这道题考验了我们对树形结构的理解以及递归和迭代算法的掌握程度。
通过本文,我们详细分析了递归和迭代两种解法,并提供了清晰的代码示例。希望这能帮助你轻松掌握N叉树的层序遍历技巧。