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

news/2024/10/17 22:21:48/

花无缺

👨‍💻博客主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创

收录于专栏 【力扣题解】


文章目录

  • 【力扣题解】P589-N叉树的前序遍历
    • 🌏题目描述
    • 💡题解
    • 🌏总结


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

💡题解

递归法

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,每个节点访问一次。

迭代法

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

代码实现:

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万字详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容的最大动力!
谢谢!


http://www.ppmy.cn/news/1283223.html

相关文章

Matlab:解非线性方程组

1、基于问题求解非线性方程组 例&#xff1a; xoptimvar(x,2); %将x定义为一个二元素优化变量 eq1exp(-exp(-(x(1)x(2))))x(2)*(1x(1)^2); %创建第一个方程作为优化等式表达式 eq2x(1)*cos(x(2))x(2)*sin(x(1))1/2; %创建第二个方程作为优化等式表达式 probe…

基于采样的自动驾驶规划算法 - PRM,RRT,RRT*,CL-RRT

本文将讲解PRM&#xff0c;RRT&#xff0c;RRT*自动驾驶规划算法原理&#xff0c;不正之处望读者指正 0 前言 机器人运动规划的基本任务&#xff1a;从开始位置到目标位置的运动 &#xff08;1&#xff09;如何躲避构型空间出现的障碍物 &#xff08;2&#xff09;如何满足机器…

【QT】qt中多线程的使用

前景&#xff1a; C#中的多线程举例 private Thread threadDownLoadParameter;threadDownLoadParameter new Thread(new ThreadStart(parameterInterface.downParameterLoadData)); //parameterInterface 实例对象&#xff0c;downParameterLoadData 方法threadDownLoadParame…

Linux阶段性项目——FTP服务器

一、FTP服务概述 ​FTP为File Transfer Protocol的缩写&#xff0c;即文件传输协议&#xff0c;是TCP/IP 协议族中的协议之一。FTP是一个用于在计算机网络上在客户端和服务器之间进行文件传输的应用层协议。RFC 959定义了FTP协议规范。是互联网上使用的最广泛的文件传输协议&a…

不浪费时间,昂首资本1分钟如何快速学习MT4价差

不要浪费时间在手工计算上&#xff0c;昂首资本解释一下如何快速学习MT4价差&#xff0c;。 想要在MT4中输入交易时&#xff0c;需要在交易窗口中设置未来交易的参数。在同一个窗口中&#xff0c;可以看到卖价和买价。如果在上面的例子中比较这两个价格&#xff0c;就会发现两…

JVM基础篇---02

为什么需要用户自定义类加载器&#xff1a; 扩展类加载器的功能&#xff1a; Java的默认类加载器主要有三个&#xff0c;分别是引导类加载器、扩展类加载器和应用程序类加载器。其中&#xff0c;引导类加载器和扩展类加载器是由JVM实现的&#xff0c;用户无法修改其行为。而应用…

Ensp DHCP 接口地址池(配置命令)

难易度&#xff1a;* 拓补图&#xff1a; 实验环境&#xff1a;一台路由器&#xff0c;两台交换机&#xff0c;四台pc机 需求&#xff1a; 左边两台PC 自动分配 IP为1.0网段 右边两台PC 自动分配 2.0 网段&#xff0c; 路由器配置命令 左边接口 分配1.0网段地址 [Huawei]…

【三维生成】稀疏重建、Image-to-3D方法(汇总)

系列文章目录 总结一下近5年的三维生成算法&#xff0c;持续更新 文章目录 系列文章目录一、LRM&#xff1a;单图像的大模型重建&#xff08;2023&#xff09;摘要1.前言2.Method3.实验 二、SSDNeRF&#xff1a;单阶段Diffusion NeRF的三维生成和重建&#xff08;ICCV 2023&am…