package Algorithms;
import java.util.*;
/**
* 590. N 叉树的后序遍历
* 给定一个 N 叉树,返回其节点值的 后序遍历 。
* <p>
* N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
* <p>
* <p>
* <p>
* 进阶:
* <p>
* 递归法很简单,你可以使用迭代法完成此题吗?
* <p>
* <p>
* <p>
* 示例 1:
* <p>
* <p>
* <p>
* 输入:root = [1,null,3,2,4,null,5,6]
* 输出:[5,6,3,2,4,1]
* 示例 2:
* <p>
* <p>
* <p>
* 输入: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]
* <p>
* <p>
* 提示:
* <p>
* N 叉树的高度小于或等于 1000
* 节点总数在范围 [0, 10^4] 内
* 通过次数51,765提交次数68,505
*/
public class postorder {
//迭代器方式
public static List<Integer> postorder(Node root) {
LinkedList<Node> nodeLinkedList = new LinkedList<>();
LinkedList<Integer> result = new LinkedList<>();
if (root == null) {
return result;
}
//添加所有节点到集合
nodeLinkedList.add(root);
//终止循环条件 集合元素全部取出
while (!nodeLinkedList.isEmpty()) {
//检索并删除此列表的最后一个元素,如果此列表为空,则返回null
Node node = nodeLinkedList.pollLast();
if (node != null) {
//在结果列表头部加入元素
result.addFirst(node.val);
//遍历子列表
for (Node child : node.children) {
//遍历元素如果不为空那么就添加节点到链表中 进行再次的循环添加
if (child != null) {
nodeLinkedList.add(child);
}
}
}
}
return result;
}
//递归方式
public static List<Integer> postorder2(Node root) {
List<Integer> result = new ArrayList<Integer>();
if (root == null) {
return result;
}
//非空节点先遍历子树再将值加上
for (int i = 0; i < root.children.size(); i++) {
result.addAll(postorder(root.children.get(i)));
}
result.add(root.val);
return result;
}
public static void main(String[] args) {
Node node1 = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node6 = new Node(6);
Node node7 = new Node(7);
Node node8 = new Node(8);
Node node9 = new Node(9);
Node node10 = new Node(10);
Node node11 = new Node(11);
Node node12 = new Node(12);
Node node13 = new Node(13);
Node node14 = new Node(14);
node1.children = new ArrayList<>();
node1.children.add(node2);
node1.children.add(node3);
node1.children.add(node4);
node1.children.add(node5);
node3.children = new ArrayList<>();
node3.children.add(node6);
node3.children.add(node7);
node7.children = new ArrayList<>();
node7.children.add(node11);
node11.children = new ArrayList<>();
node11.children.add(node14);
node4.children = new ArrayList<>();
node4.children.add(node8);
node8.children = new ArrayList<>();
node8.children.add(node12);
node5.children = new ArrayList<>();
node5.children.add(node9);
node5.children.add(node10);
node9.children = new ArrayList<>();
node9.children.add(node13);
List<Integer> integerList = postorder(node1);
System.out.println(integerList);
List<Integer> integerList2 = postorder2(node1);
System.out.println(integerList2);
}
static class Node {
public int val;
public List<Node> children;
public Node() {
}
public Node(int val) {
this.val = val;
}
public Node(int val, List<Node> children) {
this.val = val;
this.children = children;
}
}
}
这篇博客介绍了如何使用迭代和递归两种方式实现N叉树的后序遍历。首先,展示了迭代法,通过使用双端队列存储节点,并从最后一个节点开始遍历子节点,将结果添加到结果列表的头部。然后,给出了递归法,从根节点开始,先遍历所有子树再添加当前节点的值。两个方法都在给定的示例上运行并输出了正确的后序遍历结果。
300

被折叠的 条评论
为什么被折叠?



