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

递归法解N叉树的后序遍历

我们来看思路

递归思路比较简单,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 10000void 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;
}

JavaScript

var postorder = function(root) {const res = [];helper(root, res);return res;}const helper = (root, res) => {if (root == null) {return;}for (const ch of root.children) {helper(ch, res);}res.push(root.val);
};

Python3

class Solution:def postorder(self, root: 'Node') -> List[int]:ans = []def dfs(node: 'Node'):if node is None:returnfor ch in node.children:dfs(ch)ans.append(node.val)dfs(root)return ans

复杂度分析

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

 

http://www.xdnf.cn/news/978859.html

相关文章:

  • 若依微服务Openfeign接口调用超时问题
  • Java面向对象编程(OOP)深度学习解析
  • Flutter布局系统全面解析:从基础组件到复杂界面构建
  • ttyd:安全地通过网络共享您的 Linux 终端
  • Cpp 知识3
  • github action推送-构建准备步骤获取私有dockerhub镜像仓库镜像的一系列错误尝试
  • Solidity 开发从入门到精通:语法特性与实战指南
  • 在Linux下使用vscode使用交叉编译工具链的gdb对core文件进行堆栈、变量查看
  • Ubuntu下编译安装DLib的GPU版本并实现人脸检测和人脸关键点检测
  • “十五五”时期智慧城市赋能全国一体化数据市场建设:战略路径与政策建议[ 注:本建议基于公开政策文件与行业实践研究,数据引用截至2025年6月11日。]
  • 商品中心—3.商品可采可补可售的技术文档下
  • 前端面试宝典---事件循环面试题
  • 小白学Pinia状态管理
  • STM32G DMA串口发送接收
  • Linux开发工具之VsCode(Filezila、MobaXterm、Vim三合一)
  • 【笔记】NVIDIA AI Workbench 中安装 cuDNN 9.10.2
  • 每日Prompt:人像写真
  • 内存泄漏系列专题分析之二十:camx swap内存泄漏实例分析
  • Babylon.js引擎(二)
  • 【Chipyard】 conda 环境安装与使用
  • k8s在节点上加污点
  • k8s 部署服务常见错误原因
  • Windows 安装 Maven
  • 1Panel 部署 OpenResty + Redis 实现 IP 动态封禁教程
  • 软考 系统架构设计师系列知识点之杂项集萃(87)
  • Visual Studio 2022 运行提示:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
  • jsoncpp ubuntu编译问题
  • Proof of Talk专访CertiK联创顾荣辉:全周期安全方案护航Web3生态
  • Cilium动手实验室: 精通之旅---22.Cilium Traffic Optimization
  • OA协同平台有哪些功能?OA协同办公软件平台如何选择?