题目
给定一个 N 叉树,返回其节点值的后序遍历。
比如给定一个节点U,其子节点V1,V2,V3, 那么他的后序遍历顺序为[V1的子节点,V1,V2的子节点,V2,V3的子节点,V3,U]
思路一迭代
- 手动维护一个栈,然后将根结点放入
- 根结点拿出来,放入其子结点顺序为V1,V2,V3
- 拿出栈顶元素,就是V3,然后放入V3的子节点
- 以此类推
这样的遍历顺序为[U,V3,V3的子节点,V2,V2的子节点,V1,V1的子节点]
遍历顺序相反一些,就是其后序遍历顺序
代码
class Solution {
public List<Integer> postorder(Node root) {
LinkedList<Integer> res = new LinkedList<>();
Stack<Node> stack = new Stack<>();
if (root == null) {
return res;
}
stack.add(root);
while (!stack.isEmpty()) {
Node node = stack.pop();
res.addFirst(node.val);
for (Node temp : node.children) {
stack.add(temp);
}
}
return res;
}
}
复杂度分析
时间复杂度:O(K),其中 K是 N 叉树中的节点个数。每个节点只会入栈和出栈各一次。
空间复杂度:O(K)。在最坏的情况下,这棵 N 叉树只有 2 层,所有第 2 层的节点都是根节点的孩子。将根节点推出栈后,需要将这些节点都放入栈,共有 K−1 个节点,因此栈的大小为 O(K)。
递归
class Solution {
public List<Integer> postorder(Node root) {
LinkedList<Integer> res = new LinkedList<>();
helper(root, res);
return res;
}
public void helper(Node node, LinkedList<Integer> res) {
if (node == null) {
return;
}
for (Node temp : node.children) {
helper(temp, res);
}
res.add(node.val);
}
}
List<Integer> res = new LinkedList<>();
res.addFirst 这个方法找不到,res对象的类 需要为 LinkedList<Integer>,才能使用这个方法