当前位置: 首页 > news >正文

经典算法实例应用: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

解决方案

方法一:递归

思路

递归思路比较简单,N 叉树的前序遍历与二叉树的后序遍历的思路和方法基本一致,可以参考「145. 二叉树的后序遍历」的方法,每次递归时,先递归访问每个孩子节点,然后再访问根节点即可。

代码

Java

class Solution { public List<Integer> postorder(Node root) { List<Integer> res = new ArrayList<>(); helper(root, res); return res; } public void helper(Node root, List<Integer> res) { if (root == null) { return; } for (Node ch : root.children) { helper(ch, res); } res.add(root.val); } }

C++

class Solution { public: void helper(const Node* root, vector<int> & res) { if (root == nullptr) { return; } for (auto & ch : root->children) { helper(ch, res); } res.emplace_back(root->val); } vector<int> postorder(Node* root) { vector<int> res; helper(root, res); return res; } };

C#

public class Solution { public IList<int> Postorder(Node root) { IList<int> res = new List<int>(); Helper(root, res); return res; } public void Helper(Node root, IList<int> res) { if (root == null) { return; } foreach (Node ch in root.children) { Helper(ch, res); } res.Add(root.val); } }

C

#define MAX_NODE_SIZE 10000 void helper(const struct Node* root, int* res, int* pos) { if (NULL == root) { return; } for (int i = 0; i < root->numChildren; i++) { helper(root->children[i], res, pos); } res[(*pos)++] = root->val; } int* postorder(struct Node* root, int* returnSize) { int * res = (int *)malloc(sizeof(int) * MAX_NODE_SIZE); int pos = 0; helper(root, res, &pos); *returnSize = pos; return res; }

复杂度分析

  • 时间复杂度:O(m) ,其中 m 为 N 叉树的节点。每个节点恰好被遍历一次。
  • 空间复杂度:O(m) ,递归过程中需要调用栈的开销,平均情况下为 O(log m) ,最坏情况下树的深度为 m−1,需要的空间为 O(m−1) ,因此空间复杂度为 O(m) 。
http://www.jsqmd.com/news/1249889/

相关文章:

  • AI做会议纪要全链路拆解(从语音转写到行动项提取):实测17款工具后,这4个组合方案真正落地可用
  • 主板后边为什么经常有两个以太网口?第二个网口的4种用法你绝对不知道
  • 深圳夏令营哪家口碑好:军博营地专业靠谱 - 17328623207
  • 2026还在为图片水印烦恼?收藏这几种去水印方法就够了 - 免费软件工具方法教程
  • ICM创芯微 CM1003-BES SOT23-6 BMS电池保护芯片
  • TI C2000 MibSPI与SCI/LIN模块:多缓冲RAM与硬件协议引擎深度解析
  • 深入解析TI C2000 eQEP模块:正交编码器高精度位置与速度检测实战
  • VUE3实现语音播报
  • 重庆主城劳力士回收,九龙坡万象城门店出价更实在 - 融媒生活
  • 在自动化脚本中如何操作excel文件?
  • OpenWrt 23.05.3 软路由美化与功能扩展:Argon主题+Docker+iStore一站式配置记录
  • OpenAI 昨天卖「可信 Agent」,今天承认模型越狱——Presence 的信任赤字有多大?
  • 深圳夏令营哪家性价比高:军博营地服务优质 - 17728098551
  • 一个宏在调试阶段挡住所有误操作
  • 华为CANN模型部署与model-zoo优化技术解析
  • 学生工作管理系统用户手册:操作指南与功能详解
  • 提示工程监控预警系统设计与实战
  • 2026 年更新:黔南州诚信的防爆板实力厂家竞争格局,不防爆板如何拯救你的工厂? - 企业官方推荐【认证】
  • 保姆级教程:给吃灰的小米AC2100刷入原生OpenWrt,打造稳定轻量的软路由
  • TI C2000 eCAP模块深度解析:从捕获到PWM生成的实战指南
  • 嵌入式系统EMIF接口详解:SDRAM与异步存储器的配置与调试实战
  • 抖音礼物模拟器-无限礼物
  • 2026年 山东潍坊漆/烤漆/环氧漆/工业漆生产厂家:山东庞贝捷新材料有限公司 - 品牌发掘
  • Go vs Rust 高并发后端终极对决:从调度器原理到生产实战的完整工程指南
  • OpenTelemetry OBI - 非侵入式监控各种语言应用的神器
  • 深圳夏令营哪家办学经验丰富:军博营地头部品牌 - 17728181569
  • 2026主流求职APP优缺点全面对比盘点 全适用人群总结 脉脉求职避坑要点全指南FAQ
  • SAM2图像分割模型:原理、配置与实战应用
  • 接入6家大模型API后的适配器设计模式总结
  • 全景沉浸式悬空玻璃剧场