递归和迭代【Py/Java/C++三种语言详解】LeetCode每日一题240219【树DFS】LeetCode 590、 N 叉树的后序遍历

有LeetCode算法/华为OD考试扣扣交流群可加 948025485
可上全网独家的 欧弟OJ系统 练习华子OD、大厂真题
绿色聊天软件戳 od1336了解算法冲刺训练

文章目录

  • 题目链接
  • 题目描述
  • 解题思路
  • 代码
    • Python
    • Java
    • C++
    • 时空复杂度
  • 华为OD算法/大厂面试高频题算法练习冲刺训练

题目链接

LeetCode590、 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, 10(4)]
  • 0 <= Node.val <= 10(4)
  • n 叉树的高度小于或等于 1000

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

解题思路

本题的递归解法无非是将LeetCode144、二叉树的前序遍历 中的

self.dfs(ans, node.left)
self.dfs(ans, node.right)
ans.append(node.val)

改为

for children in root.children:if children:self.dfs(children)
self.ans.append(root.val)

即可。即始终维持先递归遍历所有子节点,再访问根节点的值这样的顺序。

对于N叉树而言,如果我们考虑其对称的N叉树。以示例一为例如下图所示:

在这里插入图片描述

N叉树的后序遍历顺序是**:递归地从左往右遍历子节点->访问根节点的值**

如果我们在对称N叉树中进行考虑,想得到和原N叉树的后序遍历顺序一样的结果,则其过程为**:递归地从右往左遍历子节点->访问根节点的值**

即如下图所示

在这里插入图片描述

换句话说,如果我们按照类似【二叉树DFS】LeetCode 589、 N 叉树的前序遍历的迭代法逆序地遍历node.children,对应的对称N叉树的遍历是一种类似于后序遍历,但层内是从右往左的遍历

我们再考虑这棵对称N叉树的从左往右的前序遍历,会得到原N叉树的后序遍历的逆序结果,即

暂时无法在飞书文档外展示此内容

所以我们把N叉树的后序遍历,转换为了其对称N叉树的前序遍历,最后再取逆序即可。

而对称N叉树的每层从左往右遍历,等同于其原N叉树每层从右往左遍历

所以迭代法类似二叉树的BFS,只不过是把维护一个队列改为维护一个栈。其核心过程为

stack = [root]  
while(len(stack)):node = stack.pop()ans.append(node.val)for children in node.children:    if children:stack.append(children)
return ans[::-1]    

注意每一个子节点入栈的顺序是正序的,即for children in node.children:。这样可以得到其对称N叉树的前序遍历结果了。注意最终的返回结果是ans的逆序结果ans[::-1]

代码

Python

"""
# Definition for a Node.
class Node:def __init__(self, val=None, children=None):self.val = valself.children = children
"""class Solution:def postorder(self, root: 'Node') -> List[int]:# 迭代法ans = list()if not root:return []stack = [root]  # 用栈维护DFS过程while(len(stack)):node = stack.pop()ans.append(node.val)for children in node.children:    # 子节点正序存入if children:stack.append(children)return ans[::-1]    # 答案最后要反序

Java

class Solution {public List<Integer> postorder(Node root) {List<Integer> ans = new ArrayList<>();if (root == null)return ans;Stack<Node> stack = new Stack<>();stack.push(root);while (!stack.isEmpty()) {Node node = stack.pop();ans.add(node.val);for (Node child : node.children) {if (child != null) {stack.push(child);}}}List<Integer> reversedAns = new ArrayList<>();for (int i = ans.size() - 1; i >= 0; i--) {reversedAns.add(ans.get(i));}return reversedAns;}
}

C++

class Solution {
public:vector<int> postorder(Node* root) {vector<int> ans;if (!root)return ans;stack<Node*> stack;stack.push(root);while (!stack.empty()) {Node* node = stack.top();stack.pop();ans.push_back(node->val);for (Node* child : node->children) {if (child != NULL) {stack.push(child);}}}reverse(ans.begin(), ans.end());return ans;}
};

时空复杂度

时间复杂度:O(N)。仅需一次遍历整棵树。

空间复杂度:O(N)。栈所占最大空间。


华为OD算法/大厂面试高频题算法练习冲刺训练

  • 华为OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务300+同学成功上岸!

  • 课程讲师为全网50w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化

  • 每期人数维持在20人内,保证能够最大限度地满足到每一个同学的需求,达到和1v1同样的学习效果!

  • 60+天陪伴式学习,40+直播课时,300+动画图解视频,300+LeetCode经典题,200+华为OD真题/大厂真题,还有简历修改、模拟面试、专属HR对接将为你解锁

  • 可上全网独家的欧弟OJ系统练习华子OD、大厂真题

  • 可查看链接 大厂真题汇总 & OD真题汇总(持续更新)

  • 绿色聊天软件戳 od1336了解更多

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

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

相关文章

Arcgis实现点位空间位置从上到下从左到右排序

效果 背景 工作项目中经常会遇到需要对网格进行编号&#xff0c;而编号是有一定原则的&#xff0c;比如空间位置从上到下从左到右&#xff0c;或者其它原则&#xff0c;那么都可以通过下面的方式来实现 1、准备数据 点shp文件&#xff0c;查看初始FID字段标注&#xff0c;目…

Python爬虫实战:从API获取数据

引言 在现代软件开发中&#xff0c;API已经成为获取数据的主要方式之一。API允许不同的软件应用程序相互通信&#xff0c;共享数据和功能。在本文中&#xff0c;我们将学习如何使用Python从API获取数据&#xff0c;并探讨其在实际应用中的价值。 目录 引言 二、API基础知识 …

深入浅出JVM(十四)之内存溢出、泄漏与引用

本篇文章将深入浅出的介绍Java中的内存溢出与内存泄漏并说明强引用、软引用、弱引用、虚引用的特点与使用场景 引用 在栈上的reference类型存储的数据代表某块内存地址&#xff0c;称reference为某内存、某对象的引用 实际上引用分为很多种&#xff0c;从强到弱分为&#xf…

索引学习以及索引原理

有时候&#xff0c;建索引并不一定会加快查询效率。但是&#xff0c;有时候&#xff0c;表的数据量是大数据量的话&#xff0c;还是要看下是否能使用索引优化查询效率。 1、建索引的几大原则&#xff1a; 1.1、最左前缀匹配原则非常重要的原则&#xff0c;mysql会一直向右匹配…

计算机设计大赛 深度学习大数据物流平台 python

文章目录 0 前言1 课题背景2 物流大数据平台的架构与设计3 智能车货匹配推荐算法的实现**1\. 问题陈述****2\. 算法模型**3\. 模型构建总览 **4 司机标签体系的搭建及算法****1\. 冷启动**2\. LSTM多标签模型算法 5 货运价格预测6 总结7 部分核心代码8 最后 0 前言 &#x1f5…

时间序列分析实战(四):Holt-Winters建模及预测

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

C# paddlerocrsharp识别身份证号

https://gitee.com/raoyutian/paddle-ocrsharp 项目搭建 新建控制台项目 安装paddleocrsharp 下载训练好的模型 解压放到对应的文件夹中&#xff0c;都修改为如果较新则复制 编写代码OCRHelper.cs using PaddleOCRSharp;namespace OCRTest02;public class OCRHelper {//…

推荐10款C#开源好用的Windows软件

DevToys 项目简介&#xff1a;DevToys是一个专门为开发者设计的Windows工具箱&#xff0c;完全支持离线运行&#xff0c;无需使用许多不真实的网站来处理你的数据&#xff0c;常用功能有&#xff1a;格式化&#xff08;支持 JSON、SQL、XML&#xff09;、JWT解码、URL编码/解码…

NOIP2018-J-4-对称二叉树的题解

原题描述&#xff1a; 题目描述 时间&#xff1a;1s 空间&#xff1a;256M 一棵有点权的有根树如果满足以下条件&#xff0c;则被轩轩称为对称二叉树&#xff1a; 1. 二叉树&#xff1b; 2. 将这棵树所有节点的左右子树交换&#xff0c;新树和原树对应位置的结构相同且…

【SD Card-电路】

SD Card-电路 ■ SD Card■ SD Card&#xff08;DOCK&#xff09;■ ■ SD Card ■ SD Card&#xff08;DOCK&#xff09; A_SD_DATA0 等IO之间连接芯片imax6u ■

【数据结构】队列OJ题《用队列实现栈》(题库+解析+代码)

1.前言 通过前面队列的实现和详解大家对队列应该有一定熟悉了&#xff0c;现在上强度开始做题吧 队列详解&#xff1a;http://t.csdnimg.cn/dvTsW 2.OJ题目训练225. 用队列实现栈 题目分析 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0…

Springboot 多级缓存设计与实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Python算法题集_子集

Python算法题集_子集 题78&#xff1a;子集1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【递归】2) 改进版一【双层下标循环】3) 改进版二【双层枚举循环】4) 改进版三【双层下标循环位运算】5) 改进版四【单行双层循环位运算】6) 改进版五【…

算法沉淀——动态规划之子数组、子串系列(上)(leetcode真题剖析)

算法沉淀——动态规划之子数组、子串系列 01.最大子数组和02.环形子数组的最大和03.乘积最大子数组04.乘积为正数的最长子数组长度 01.最大子数组和 题目链接&#xff1a;https://leetcode.cn/problems/maximum-subarray/、 给你一个整数数组 nums &#xff0c;请你找出一个具…

golang学习6,glang的web的restful接口传参

1.get传参 //get请求 返回json 接口传参r.GET("/getJson/:id", controller.GetUserInfo) 1.2.接收处理 package controllerimport "github.com/gin-gonic/gin"func GetUserInfo(c *gin.Context) {_ c.Param("id")ReturnSucess(c, 200, &quo…

DSP,QX320F280049C,完整版使用手册,数据手册

32位双核CPU&#xff0c; 主频150MHz 支持FPU、VCU、TPU flash 1MB SRAM 500KB 3个3MSPS&#xff0c;12位 ADC 24个增强型ePWM 16个高分辨率HRPWM&#xff08;150PS&#xff09;

顶顶通呼叫中心中间件-如何使处于机器人话术中的通话手动转接到坐席分机上讲解(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件使用httpapi实现电话转接操作过程讲解(mod_cti基于FreeSWITCH) 需要了解呼叫中心中间件可以点以下链接了解顶顶通小孙 1、使用httpapi接口转接 一、打开web版的ccadmin并且找到接口测试 打开web-ccadmin并且登录&#xff0c;登录完成之后点击运维调试-再…

Linux使用Docker部署在线协作白板WBO并结合内网穿透发布公网远程访问

文章目录 前言1. 部署WBO白板2. 本地访问WBO白板3. Linux 安装cpolar4. 配置WBO公网访问地址5. 公网远程访问WBO白板6. 固定WBO白板公网地址 前言 WBO在线协作白板是一个自由和开源的在线协作白板&#xff0c;允许多个用户同时在一个虚拟的大型白板上画图。该白板对所有线上用…

【JavaEE】_前端POST请求借助form表单向后端传参

对于POST请求&#xff0c;可以通过body部分来传递参数&#xff1b; 对于通过form表单的方式将POST请求的参数传递给后端来说&#xff0c;body部分的格式就是query string的格式&#xff0c;即form表单&#xff1b; 此时请求报头部分有&#xff1a;Content-Type : application…

spring框架Bean的作用域?对需要保持会话状态的bean应使用prototype作用域?为啥?

当一个bean被定义为"prototype"作用域时&#xff0c;每次请求该bean时都会创建一个新的实例&#xff0c;而不是像"singleton"作用域那样共享同一个实例。 对于需要保持会话状态的bean&#xff0c;如果使用"singleton"作用域&#xff0c;会导致所…