行业知识
递归和迭代【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 访问根节点的值**
即如下图所示
换句话说,如果我们按照类似【二叉树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 = val self.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 postorder(Node root) { List ans = new ArrayList(); if (root == null) return ans; Stack 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 reversedAns = new ArrayList(); for (int i = ans.size() - 1; i >= 0; i--) { reversedAns.add(ans.get(i)); } return reversedAns; }}C++
class Solution {public: vector postorder(Node* root) { vector ans; if (!root) return ans; stack 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了解更多
-
上一篇:服务器存储怎么下掉?