LeetCode 590. N 叉树的后序遍历

590. N 叉树的后序遍历

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

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

示例 1:

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

示例 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]
输出:[2,6,14,11,7,3,12,8,4,13,9,10,5,1]

提示:

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

进阶:递归法很简单,你可以使用迭代法完成此题吗?

解法思路:

1、递归(Recursion)

2、迭代(Iterator)效率低

法一:

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<Integer> postorder(Node root) {// Recursion// Time: O(n), n 为节点数// Space: O(n)List<Integer> res = new ArrayList<>();helper(root, res);return res;}private void helper(Node root, List<Integer> res) {if (root == null) return;for (Node child : root.children) {helper(child, res);}res.add(root.val);}
}

法二:

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<Integer> postorder(Node root) {// Iterator// Time: O(n), n 为节点数// Space: O(n)List<Integer> res = new ArrayList<>();if (root == null) return res;Map<Node, Integer> map = new HashMap<Node, Integer>();Deque<Node> stack = new ArrayDeque<Node>();Node node = root;while (node != null || !stack.isEmpty()) {while (node != null) {stack.addFirst(node);List<Node> children = node.children;if (!children.isEmpty()) {map.put(node, 0);node = children.get(0);} else {node = null;}}node = stack.peek();int idx = map.getOrDefault(node, -1) + 1;List<Node> children = node.children;if (!children.isEmpty() && children.size() > idx) {map.put(node, idx);node = children.get(idx);} else {res.add(node.val);stack.removeFirst();map.remove(node);node = null;}}return res;}
}

优化迭代:

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<Integer> postorder(Node root) {// Optimize Iterator// Time: O(n), n 为节点数// Space: O(n)List<Integer> res = new ArrayList<>();if (root == null) return res;Deque<Node> stack = new ArrayDeque<>();Set<Node> visited = new HashSet<Node>();stack.addFirst(root);while (!stack.isEmpty()) {Node node = stack.peek();if (node.children.isEmpty() || visited.contains(node)) {stack.removeFirst();res.add(node.val);continue;}for (int i = node.children.size() - 1; i >= 0; --i) {stack.addFirst(node.children.get(i));}visited.add(node);}return res;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616467.shtml

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

相关文章

Redis优化和解决缓存问题

目录 redis的2种持久化方式 RDB持久化 AOF持久化 redis优化 redis的三大缓存问题 缓存雪崩的解决方案&#xff1a; 缓存穿透的解决方案&#xff1a; 缓存击穿的解决方案&#xff1a; 如何保证 MySQL 和 redis 的数据一致性&#xff1f; redis的2种持久化方式 RDB持久化…

C桑(Cython)从入门到入土(2): np数组操作对比

C桑(Cython)从入门到入土 2. np数组操作对比 Node sc518 Copy has image data of type unsigned long long实际上, &#x1f446;&#x1f3fb;这个错误是我探索Cython的缘起… code1: Form: 更现代的方法是使用内存视图而不是指针&#xff1a; cdef np.uint32_t[:,:,::1] …

The True Beauty; What is beauty;

Tiny syposis on Beauty Standards I) webpage addressII) text content excerption I) webpage address URL route II) text content excerption I am forensic artist 素描师&#xff08;法医的&#xff09;, worked for the San Jose Police Department 警局&#xff0c;f…

一个神奇的SQL聚合查询案例

今天给大家分享一个 SQL 案例&#xff0c;假如存在以下两个表&#xff1a; CREATE TABLE t1 (val1 INT); INSERT INTO t1 VALUES (1), (2), (3);CREATE TABLE t2 (val2 INT); INSERT INTO t2 VALUES (10), (20), (30);每个表包含 3 条数据。请问&#xff0c;以下查询返回结果是…

在C++中控制调试信息的输出通常通过预处理指令(如 #define)和条件编译指令(如 #ifdef、#ifndef、#endif)来实现。

文章目录 在C中&#xff0c;控制调试信息的输出通常通过预处理指令&#xff08;如 #define&#xff09;和条件编译指令&#xff08;如 #ifdef、#ifndef、#endif&#xff09;来实现。这种方法提供了一种灵活的方式来包含或排除调试代码&#xff0c;而无需对代码本身进行大量修改…

【昕宝爸爸小模块】深入浅出之Java 8中的 Stream

深入浅出之Java 8中的 Stream 一、&#x1f7e2;典型解析1.1 &#x1f7e0;Java 8中的Stream 都能做什么1.2 &#x1f7e0;Stream的创建 二、✅ Stream中间操作2.1 &#x1f7e0;Filter2.2 &#x1f7e0;Map2.3 &#x1f7e0;limit / skip2.4 &#x1f7e0;sorted2.5 &#x1…

CCF模拟题 202309-1 坐标变换(其一)

问题描述 试题编号&#xff1a; 202309-1 试题名称&#xff1a; 坐标变换&#xff08;其一&#xff09; 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 对于平面直角坐标系上的坐标&#xff08;x,y&#xff09;&#xff0c;小P定义了一个包含…

props传值问题

父组件和子组件同时展现 同步任务无需添加额外的代码&#xff0c;正常写&#xff0c;而异步任务需要添加下面的解决方案&#xff0c;因为异步任务需要等待响应才能进行赋值。 父组件&#xff1a; <div><UploadFile ref"child" :data"tableData"…

【C#】当重复使用一段代码倒计时时,使用普通类和静态方法,实现简单的封装性、可扩展性、可维护性

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

程序员找不到工作原因以及解决办法

程序员找不到工作原因以及解决办法 程序员当前就业环境真的很差&#xff0c;所以找工作跳槽一定要讲究方式方法&#xff0c;接下来我讲一下你找不着工作的原因以及解决办法&#xff0c;大家先点赞收藏&#xff0c;内容敏感我怕你刷不到 沟通200个全是未读那就是你的城市没有招聘…

静态长效代理IP和动态短效代理IP有哪些用途?分别适用场景是什么?

静态长效代理IP和动态短效代理IP是两种常见的代理IP类型&#xff0c;它们在用途和适用场景上存在一定的差异。了解它们的特性以及使用场景有助于我们更好地利用代理IP&#xff0c;提高网络访问的效率和安全性。 一、静态长效代理IP 1. 用途 静态长效代理IP是指长期保持稳定的代…

安全强化学习笔记

这里写自定义目录标题 参考资料环境算法CPO 2017 ICMLPCPO 2019 ICLRFOCOPS 2020 NIPSCRPO 2021 ICMLCUP 2022 NIPS TRPO 如何看懂TRPO里所有的数学推导细节? - 小小何先生的回答 - 知乎 参考资料 Safe Reinforcement Learning 安全/约束强化学习路线图&#xff08;Safe RL…

JVM相关问题及答案(2024)

1、什么是JVM&#xff0c;它是如何工作的&#xff1f; JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;它是一个虚拟机器&#xff0c;用于执行Java字节码。JVM的主要任务是将Java字节码翻译成特定平台的机器码&#xff0c;并在特定平台上运行…

Java的NIO

Java NIO&#xff08;New I/O&#xff0c;新 I/O&#xff09;是 Java 1.4 版本引入的一组用于进行非阻塞 I/O 操作的 API。相比于传统的 Java I/O&#xff08;或称为 IOStream&#xff09;&#xff0c;Java NIO 提供了更为灵活、可扩展和高性能的 I/O 处理方式。 Java NIO 的核…

Python-动态烟花【附完整源码】

烟花代码 运行效果&#xff1a;Python动态烟花代码 import pygame from random import randint from random import uniform from random import choice import math vector pygame.math.Vector2 # 重力变量 gravity vector(0, 0.3) # 控制窗口的大小 DISPLAY_WIDTH DISP…

C#核心--实践小项目(贪吃蛇)

C#核心实践小项目 -- 贪吃蛇 必备知识点--多脚本文件 &#xff08;可观看CSharp核心--52集进行了解&#xff09; 必备知识点--UML类图 必备知识点--七大原则 贪吃蛇 项目展示 控制方向的是&#xff1a;WSAD 确定键是&#xff1a;J 需求分析&#xff08;UML类图&#xff09…

第11章 GUI Page495~496 步骤三十一:另存为别的文件

当前的TrySaveFile(bool hint_on_dirty true)有两个特征无法满足“另存”的需求&#xff1a; 一&#xff0c;TrySaveFile仅在数据为“新”的时候才提问用户输入文件名。而“另存”总是要求用户输入一个文件名&#xff0c;多以它总应该弹出一个文件选择对话框&#xff0c;这也…

【网络安全】【密码学】【北京航空航天大学】实验二、数论基础(中)【C语言和Java实现】

实验二、数论基础&#xff08;中&#xff09; 一、实验内容 1、扩展欧几里得算法&#xff08;Extended Euclid’s Algorithm&#xff09; &#xff08;1&#xff09;、算法原理 已知整数 a , b ,扩展的欧几里得算法可以在求得 a , b 的最大公约数的同时&#xff0c;找到一对…

Python如何连接RabbitMQ并编写简单的生产者和消费者代码?有录播直播和私教视频教程

更简单的获取连接的方式 get_connection方法 这个方法的签名如下&#xff1a; def get_connection(host127.0.0.1,port5672,username"zhangdapeng",password"zhangdapeng520",virtual_host/, ):"""获取RabbitMQ客户端连接对象:param hos…

LeetCode[105] 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,null,15,7] …