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

news2024/11/20 10:23:51

花无缺

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

收录于专栏 【力扣题解】


文章目录

  • 【力扣题解】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.coloradmin.cn/o/1337773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

electron autoUpdater自动更新使用示例 客户端+服务端

封装好的 update.js 模块 use strict; const { autoUpdater } require(electron) // 更新检测 // https://www.electronjs.org/zh/docs/latest/api/auto-updaterconst checkUpdate (serverUrl) >{const updateUrl ${serverUrl}/update?platform${process.platform}&am…

【vue】avue-crud表单属性配置(表格以及列)

目录 前言1. 表格属性2. 列属性 前言 项目实战中需要调某个样式&#xff0c;但作为后端开发者也只能硬着头皮&#xff0c;此贴作为初学前端的第一帖&#xff0c;以下为学习笔记。 对应form属性文档可看这篇文章&#xff1a;form属性文档对应curd属性文档可看这篇文章&#xf…

tekton 发布 kubernetes 应用

tekton 发布 kubernetes 应用 基于Kubernetes 服务部署 Tekton Pipeline 实例&#xff0c;部署完成后使用tekton来完成源码拉取、应用打包、镜像推送和应用部署。 本文实现一个 golang-helloworld 项目 CI/CD 的完整流程&#xff0c;具体包括以下步骤&#xff1a; 从 gitee…

验证 Mixtral-8x7B-Instruct-v0.1 和 LangChain SQLDatabaseToolkit 的集成效果

验证 Mixtral-8x7B-Instruct-v0.1 和 LangChain SQLDatabaseToolkit 的集成效果 0. 背景1. 验证环境说明2. 验证开始2-1. 准备测试数据库2-2. 读取环境配置信息2-3. 导入依赖包2-3. 创建 SQLDatabaseToolkit 对象和 AgentExecutor 对象2-4. 第1个测试 - 描述一个表2-5. 第2个测…

关于Axios发送Get请求无法添加Content-Type

在拦截器中尝试给headers添加Content-Type&#xff1a; request.interceptors.request.use(config > {if (!config.headers[Content-Type]) {config.headers[Content-Type] application/json;}return config;},error > {return Promise.reject(error)} )如果是GET请求&…

【流复制环境PostgreSQL-14.1到PostgreSQL-16.1大版本升级】

PostgreSQL大版本会定期添加新特性&#xff0c;这些新特性通常会改变系统表的布局&#xff0c;但内部数据存储格式很少改变。pg_upgrade通过创建新的系统表和重用旧的用户数据文件来执行快速升级。 pg_upgrade升级主要有三种用法&#xff1a; 1、使用pg_upgrade拷贝升级。 2、…

Redis分布式缓存之主从哨兵分片集群

Redis主从 数据同步原理 Redis哨兵 Redis分片集群 集群伸缩&#xff1a;在集群中插入或删除某个节点 集群故障转移

使用ffmpeg实现视频旋转并保持清晰度不变

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg -i source.mp4 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-…

Java 基础学习(十九)网络编程、反射

1 Socket编程 1.1 Socket编程概述 1.1.1 Socket简介 在网络编程中&#xff0c;Socket&#xff08;套接字&#xff09;是一种抽象概念&#xff0c;它用于在不同计算机之间进行通信。Socket可以看作是一种通信的端点&#xff0c;可以通过Socket与其他计算机上的程序进行数据传…

亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 国赛选手带你看 Elasticache Serverless

抛砖引玉 讲一下作者背景&#xff0c;曾经参加过国内世界技能大赛云计算的选拔&#xff0c;那么在竞赛中包含两类&#xff0c;一类是架构类竞赛&#xff0c;另一类就是 TroubleShooting 竞赛&#xff0c;对应的分别为亚马逊云科技 GameDay 和亚马逊云科技 Jam&#xff0c;想必…

Pytest框架 —— 用例标记和测试执行篇!

pytest用例标记和测试执行篇 上一篇文章入门篇咱们介绍了pytest的前后置方法和fixture机制&#xff0c;这个章节主要给大家介绍pytest中的标记机制和用例执行的方法。pytest可以通过标记将数据传入于测试函数中&#xff0c;也可以通过标记中对执行的用例做筛选&#xff0c;接下…

WebGL开发安全培训应用

使用 WebGL 开发安全培训应用可以为员工提供在虚拟环境中体验危险情境、学习安全操作和应急处理技能的机会。以下是开发安全培训应用的一般步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.明确…

Web(10)XSS漏洞

XSS跨站脚本攻击 XSS是什么 XSS(cross-site-scripting) 即是跨站脚本攻击&#xff0c;是一种网站应用程序的安全漏洞攻击&#xff0c;是代码注入的一种。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在观看网页时就会受到影响。这类攻击通常包含了 HTML 以及用户端…

实战10 角色管理

目录 1、角色后端接口 2、角色列表查询 2.1 效果图 2.2页面原型代码 2.3 角色api代码 role.js 2.4 查询角色列表代码 4、 新增和编辑角色 5、删除角色 6、分配权限 6.1 分配权限思路 6.2 分配权限回显接口 6.3 分配权限回显前端实现 6.4分配权限后端接口 6.4.1 R…

实验八 基于FPGA的分频器的设计

基本任务一&#xff1a;设计一个分频器&#xff0c;输入信号50MHZ,输出信号频率分别为1KHZ&#xff0c;500HZ&#xff0c;1HZ。 m100&#xff1a; 扩展任务二&#xff1a;控制蜂鸣器发出滴滴滴的声音

补题与总结:leetcode第 377 场周赛

文章目录 写在最前面的复盘2977. 转换字符串的最小成本 II&#xff08;Flody 爆搜优化->dp&#xff09; 写在最前面的复盘 感谢leetcode&#xff0c;丰富了我为数不多的卡常经验 2是简单思维题&#xff0c;但卡常 4是爆搜优化&#xff0c;也卡常&#xff0c;补题时给卡麻了…

【HBase】——简介

1 HBase 定义 Apache HBase™ 是以 hdfs 为数据存储的&#xff0c;一种分布式、可扩展的 NoSQL 数据库。 2 HBase 数据模型 • HBase 的设计理念依据 Google 的 BigTable 论文&#xff0c;论文中对于数据模型的首句介绍。 Bigtable 是一个稀疏的、分布式的、持久的多维排序 m…

.Net7.0 或更高版本 System.Drawing.Common 上传图片跨平台方案

项目升级.Net7.0以后&#xff0c;System.Drawing.Common开关已经被删除&#xff0c;且System.Drawing.Common仅在 Windows 上支持 &#xff0c;于是想办法将原来上传图片验证文件名和获取图片扩展名方法替换一下&#xff0c;便开始搜索相关解决方案。 .Net6.0文档&#xff1a;…

Python 高级(四):线程池 ThreadPoolExecutor

大家好&#xff0c;我是水滴~~ 当涉及到需要同时处理多个任务的情况时&#xff0c;使用线程池是一种高效的方法。Python提供了concurrent.futures模块&#xff0c;其中的ThreadPoolExecutor类使得使用线程池变得非常方便。本文将详细介绍Python线程池的概念、使用方法和示例代…

使用 AnyGo 修改 iPhone 手机定位

在当今数字化时代&#xff0c;我们的手机已经成为我们日常生活中不可或缺的一部分。然而&#xff0c;有时我们可能会遇到一些情况&#xff0c;需要修改手机的定位信息。这个需求可能来自于各种不同的原因&#xff0c;包括但不限于保护个人隐私、测试应用程序的地理位置相关功能…