Leetcode-590 N叉树的后序遍历

题目

给定一个 N 叉树,返回其节点值的后序遍历

例如,给定一个 3叉树 :

返回其后序遍历: [5,6,3,2,4,1].

说明: 递归法很简单,你可以使用迭代法完成此题吗?

思路一: 递归法

正如题目中所言, 递归法确实很简单, 利用二叉树中的”左-右-根”顺序进行推广, 即先遍历子树, 最后将根的值放入list中即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> children;

public Node() {}

public Node(int _val) {
val = _val;
}

public Node(int _val, List<Node> _children) {
val = _val;
children = _children;
}
};
*/

class Solution {
public List<Integer> postorder(Node root) {
List<Integer> list = new ArrayList<>();
postorder(root, list);
return list;
}

private void postorder(Node root, List<Integer> list) {
if (root == null) return;
for (Node child : root.children) {
postorder(child, list);
}
list.add(root.val);
}
}

思路二: 迭代

树的遍历除了用递归实现, 还可以用迭代实现.

  1. 先将根结点入栈
  2. 取出栈中结点, 并将结点的值放入结果队列的头部, 将其子结点按左到右的顺序入栈
  3. 重复第二步直至栈为空
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public List<Integer> postorder(Node root) {
LinkedList<Node> stack = new LinkedList<>();
LinkedList<Integer> output = new LinkedList<>();
if (root == null) return output;
stack.add(root);
while (!stack.isEmpty()) {
Node tmpNode = stack.pollLast();
output.addFirst(tmpNode.val);
for (Node child : tmpNode.children) {
stack.add(child);
}
}
return output;
}
}