【力扣题解】P589-N叉树的前序遍历-Java题解

👨‍💻博客主页:@花无缺

欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

本文由 花无缺 原创

收录于专栏 【力扣题解】


文章目录


【力扣题解】P589-N叉树的前序遍历

P589.N叉树的前序遍历

🌏题目描述

给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[1,3,5,6,2,4]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]

提示:

  • 节点总数在范围 [0, 104]
  • 0 <= Node.val <= 104
  • n 叉树的高度小于或等于 1000

💡题解

递归法

java 复制代码
public List<Integer> preorder(Node root) {
    // 空树, 返回空列表
    if (root == null) return new ArrayList<>();
    List<Integer> res = new ArrayList<>();
    // 调用递归函数 order, 前序递归遍历 N 叉树
    order(root, res);
    // 返回结果列表
    return res;
}
// 递归法
public void order(Node root, List<Integer> list) {
    // 节点为空, 递归终止
    if (root == null) return;
    // 遍历根节点
    list.add(root.val);
    // 按从左到右的顺序递归遍历孩子节点
    for (Node child : root.children) {
        order(child,list);
    }
}

时间复杂度:O(n),需要访问 N 叉树的所有节点,节点数为 n,每个节点访问一次。

迭代法

java 复制代码
public List<Integer> preorder(Node root) {
    // 空树, 返回空列表
    if (root == null) return new ArrayList<>();
    List<Integer> res = new ArrayList<>();
    // 使用 Deque 模拟一个栈存储 N 叉树的节点
    Deque<Node> stack = new LinkedList<>();
    // 根节点先进栈
    stack.offerLast(root);
    while (!stack.isEmpty()) {
        // 栈顶节点出栈
        Node node = stack.pollLast();
        // 将栈顶(根)节点加入结果列表
        res.add(node.val);
        // 将当前节点(根节点)的孩子节点入栈
        // 我们这里入栈的顺序是从最右边的孩子节点到最左边的孩子节点: 根->右边的孩子节点->左边的孩子节点
        // 这样在出栈的时候顺序就是前序遍历的顺序: 根->左边的孩子节点->右边的孩子节点
        for (int i = node.children.size() - 1; i >= 0; i--) {
            Node child = node.children.get(i);
            stack.offerLast(child);
        }
    }
    return res;
}

时间复杂度:O(n),需要访问 N 叉树的所有节点,节点数为 n,每个节点访问一次。

🌏总结

不管是 N 叉树的递归遍历还是迭代遍历,其算法思路和二叉树的递归和迭代都是一样的,递归算法是利用一个隐藏的栈来实现树的遍历,而迭代算法是显式实现一个栈来模拟递归的过程。

对于 N 叉树的前序遍历递归法,我们是先遍历 N 叉树的根节点,然后依次递归遍历它的各个孩子节点。

对于 N 叉树的前序遍历的迭代法,我们手动实现一个栈,然后先让根节点进栈,之后根节点出栈,出栈过程中执行我们需要的遍历操作,然后把当前节点的孩子节点入栈,但是孩子节点的入栈顺序是有严格要求的,对于前序遍历来说,我们要先从靠近树右边的节点入栈,一直到树的最左边的节点入栈。

代码实现:

java 复制代码
for (int i = node.children.size() - 1; i >= 0; i--) {
    Node child = node.children.get(i);
    stack.offerLast(child);
}

为什么要从最右边的节点开始入栈呢,因为这样的话,对应 N 叉树节点的入栈顺序就是:根->右边的孩子节点->左边的孩子节点,而出栈遍历的时候的顺序就会符合前序遍历的顺序:根->左边的孩子节点->右边的孩子节点,这样我们就借助栈实现了对 N 叉树的前序遍历。

作者:花无缺(huawuque404.com)


🌸欢迎关注我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~

🍻一起进步-刷题专栏:【力扣题解】

🥇往期精彩好文:

📢【CSS选择器全解指南】

📢【HTML万字详解】

你们的点赞👍 收藏⭐ 留言📝 关注✅

是我持续创作,输出优质内容的最大动力!

谢谢!

相关推荐
m0_571957581 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
魔道不误砍柴功3 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2343 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
pianmian13 小时前
python数据结构基础(7)
数据结构·算法
闲晨3 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
测开小菜鸟5 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
好奇龙猫5 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
P.H. Infinity6 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天6 小时前
java的threadlocal为何内存泄漏
java
sp_fyf_20246 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘