LeetCode算法题-N-ary Tree Postorder Traversal(Java实现)
这是悦乐书的第269次更新,第283篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第136题(顺位题号是590)。给定一个n-ary树,返回其节点值的后序遍历。例如,给定一个3-ary树:
1
/ | \
3 2 4
/ \
5 6
其后序遍历结果为:[5,6,3,2,4,1]。
注意:递归解决方案是微不足道的,你可以用迭代的方式做吗?
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
和昨天的题目求n-ary树的前序遍历结果类似,今天的题目是求其后序遍历结果,也就是先左子树,再右子树,最后根节点,依旧使用递归的方法,只不过是将辅助方法里的一行代码移动到for循环后面去执行而已,其他的地方和昨天的代码没什么区别。
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int _val,List<Node> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public List<Integer> postorder(Node root) {
if (root == null) {
return new ArrayList<Integer>();
}
List<Integer> list = new ArrayList<Integer>();
getValue(root, list);
return list;
}
public List<Integer> getValue(Node root, List<Integer> list) {
if (root == null) {
return null;
}
if (root.children != null) {
for (Node n : root.children) {
getValue(n, list);
}
}
list.add(root.val);
return list;
}
}
03 第二种解法
使用迭代的方式。从题目的例子中可以看出,根节点在最后,最下面一层的节点在最前面,都是从左往右的顺序,那么反过来看,[1,4,2,3,6,5],根节点被摆在了第一位,第二层的节点4从右边换到了左边,在左边的3换到了右边,第三层的节点也是如此。那么我们可以直接使用栈,从根节点开始入栈,然后根节点第一个出栈,接着是第二层的第一个节点3入栈,然后是2入栈,最后是4入栈,进入第二次循环,首先出栈的是4,然后是3,最后是3,并且同时也将第三层的节点入栈了。最后我们将拿到的结果反转即可,借助集合工具类来完成。
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int _val,List<Node> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public List<Integer> postorder(Node root) {
if (root == null) {
return new ArrayList<Integer>();
}
List<Integer> list = new ArrayList<Integer>();
Stack<Node> stack = new Stack<Node>();
stack.push(root);
while (!stack.isEmpty()) {
Node temp = stack.pop();
list.add(temp.val);
if (temp.children != null) {
for (Node n : temp.children) {
stack.push(n);
}
}
}
Collections.reverse(list);
return list;
}
}
04 第三种解法
针对上面的第二种解法,我们也可以不必反转list,二是使用LinkedList来存节点值,借助其addFirst方法,始终把节点值存入第一位。
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int _val,List<Node> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public List<Integer> postorder(Node root) {
if (root == null) {
return new LinkedList<Integer>();
}
LinkedList<Integer> list = new LinkedList<Integer>();
Stack<Node> stack = new Stack<Node>();
stack.push(root);
while (!stack.isEmpty()) {
Node temp = stack.pop();
list.addFirst(temp.val);
if (temp.children != null) {
for (Node n : temp.children) {
stack.push(n);
}
}
}
return list;
}
}
05 第四种解法
使用两个栈。第一个栈正常的做入栈出栈操作,从根节点开始,第二个栈在循环内部只做入栈操作,使得根节点被压到了栈底部,而最后一个出栈的节点被压到了第二个栈的栈顶,此时再对第二个栈进行出栈操作,就实现了后序遍历。
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int _val,List<Node> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public List<Integer> postorder(Node root) {
if (root == null) {
return new ArrayList<Integer>();
}
List<Integer> list = new ArrayList<Integer>();
Stack<Node> stack = new Stack<Node>();
Stack<Node> stack2 = new Stack<Node>();
stack.push(root);
while (!stack.isEmpty()) {
Node temp = stack.pop();
stack2.push(temp);
if (temp.children != null) {
for (Node n : temp.children) {
stack.push(n);
}
}
}
while (!stack2.isEmpty()) {
list.add(stack2.pop().val);
}
return list;
}
}
06 小结
算法专题目前已日更超过四个月,算法题文章136+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-N-ary Tree Postorder Traversal(Java实现)的更多相关文章
- LeetCode算法题-Construct Quad Tree(Java实现)
这是悦乐书的第224次更新,第237篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第91题(顺位题号是427).我们想使用四叉树来存储N×N布尔网格.网格中的每个单元格只 ...
- LeetCode算法题-Invert Binary Tree
这是悦乐书的第194次更新,第199篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第55题(顺位题号是226).反转二叉树.例如: 输入: 4 / \ 2 7 / \ / ...
- LeetCode算法题-Balanced Binary Tree(Java实现)
这是悦乐书的第167次更新,第169篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第26题(顺位题号是110).给定二叉树,判断它是否是高度平衡的.对于此问题,高度平衡二 ...
- LeetCode算法题-Merge Two Binary Trees(Java实现)
这是悦乐书的第274次更新,第290篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第142题(顺位题号是617).提供两个二叉树,将其合并为新的二叉树,也可以在其中一个二 ...
- LeetCode算法题-Unique Morse Code Words(Java实现)
这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...
- LeetCode算法题-Robot Return to Origin(Java实现)
这是悦乐书的第281次更新,第298篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第149题(顺位题号是657).在2D平面上有一个从位置(0,0)开始的机器人.给定其移 ...
- LeetCode算法题-Min Cost Climbing Stairs(Java实现)
这是悦乐书的第307次更新,第327篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第176题(顺位题号是746).在楼梯上,第i步有一些非负成本成本[i]分配(0索引). ...
- LeetCode算法题-Longest Word in Dictionary(Java实现)
这是悦乐书的第303次更新,第322篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第171题(顺位题号是720).给出表示英语词典的字符串单词数组,找到单词中长度最长的单 ...
- LeetCode算法题-1-bit and 2-bit Characters(Java实现)
这是悦乐书的第302次更新,第321篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第170题(顺位题号是717).有两个特殊字符,第一个字符可以用一个比特0表示,第二个字 ...
- LeetCode算法题-Degree of an Array(Java实现)
这是悦乐书的第294次更新,第312篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第162题(顺位题号是697).给定一个由正整数组成的非空数组,该数组的度数被定义为任意 ...
随机推荐
- redis 系列18 事件
一.概述 Redis服务器是一个事件驱动程序,服务器需要处理两类事件:1文件事件,2时间事件.文件事件是关于客户端与服务器之间的通信操作.时间事件是关于服务器内部的一些定时操作.本篇还是参照" ...
- 【朝花夕拾】Android Log篇
前言 从事Android开发的这些年中,经常碰到这样一个现象:同一款app中,往往有好几种风格迥异的log处理方式,有时候会让维护者晕头转向.同时笔者也经常碰带一些模棱两可的问题:Log等级分好几种 ...
- plsql可视化文件夹解释
function:一般是存储函数或者方法 procedures:一般是存放存储过程 Table:一般是存放建的表 packages:包(头) package bodies:包体types:类型 typ ...
- Asp.Net Core中利用Seq组件展示结构化日志功能
在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...
- 编写基于Property-based的单元测试
编写基于Property-based的单元测试 作为一个开发者,你可能认为你的职责就是编写代码从而完成需求.我不敢苟同,开发者的工作是通过软件来解决现实需求,编写代码只是软件开发的其中一个方面,编写可 ...
- RabbitMQ消息队列(八)-通过Topic主题模式分发消息(.Net Core版)
前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过routingkey来匹配消息的模式已经有一定了解那fanout也很好 ...
- SQL优化总结之一
一.实践中如何优化mysql 1) SQL语句及索引的优化 2) 数据库表结构的优化 3) 系统配置的优化 4) 硬件优化 二.索引的底层实现原理和优化 2.1 底层实现 在DB2数据库中索引采用的是 ...
- 痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是第一款Cortex-M微控制器. 1.天生荣耀:ARM Cortex-M处理器由来 ARM公司自2004年推出ARMv7内核架构时,摒弃 ...
- Perl线程队列:Thread::Queue
(Thread::Queue)队列数据结构(FIFO)是线程安全的,它保证了某些线程从一端写入数据,另一些线程从另一端读取数据.只要队列已经满了,写入操作就自动被阻塞直到有空间支持写操作,只要队列空了 ...
- 实时显示数据 SignalR 及时消息提醒( 立即向其推送内容)
实时显示数据 SignalR 及时消息提醒( 立即向其推送内容) http://www.cnblogs.com/Leo_wl/p/5634910.html <!--Reference the ...