【力扣题解】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万字详解】

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

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

谢谢!

相关推荐
Brookty40 分钟前
【算法】归并排序
数据结构·算法·排序算法
User_芊芊君子42 分钟前
跨平台开发选Java还是C?应用场景与性能深度对比
java·c语言·开发语言
寻梦人1213842 分钟前
关于在Spring Boot + SpringSecurity工程中Sercurity上下文对象无法传递至新线程的问题解决
java·spring boot·后端
一只小松许️2 小时前
Rust泛型与特性
java·开发语言·rust
星星火柴9363 小时前
数据结构:哈希表 | C++中的set与map
数据结构·c++·笔记·算法·链表·哈希算法·散列表
CS创新实验室5 小时前
数据结构:最小生成树的普里姆算法和克鲁斯卡尔算法
数据结构·算法·图论·计算机考研
angushine7 小时前
Gateway获取下游最终响应码
java·开发语言·gateway
爱的叹息7 小时前
关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析
java·python·jar
一一Null7 小时前
Token安全存储的几种方式
android·java·安全·android studio
西贝爱学习7 小时前
数据结构:C语言版严蔚敏和解析介绍,附pdf
c语言·开发语言·数据结构