问题
给定一个 N 叉树,返回其节点值的后序遍历。
例如,给定一个 \(3叉树\):
返回其后序遍历: \([5,6,3,2,4,1]\).
**说明: **递归法很简单,你可以使用迭代法完成此题吗?
解法
与589. N叉树的前序遍历基本一样,只是把前序变成后续即可。
但是迭代的后序遍历比较难。这里考虑用双栈法处理。同时,联想到java的List接口提供一个add(int index, E val)的方法,可以当作栈使用,所以,其实第二个栈可以直接用result代替。
代码
java
递归
/*
// 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 {
private List<Integer> result = new LinkedList<>();
public List<Integer> postorder(Node root) {
if (root == null) {
return result;
}
dfs(root);
return result;
}
private void dfs(Node root) {
if (root == null) {
return;
}
//优先去遍历子树而不是root本身
if (root.children !=null) {
for(Node node:root.children) {
dfs(node);
}
}
result.add(root.val);
}
}
递归
/*
// 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 {
private List<Integer> result = new LinkedList<>();
public List<Integer> postorder(Node root) {
if (root == null) {
return result;
}
Stack<Node> stack = new Stack<>();
stack.add(root);
while(!stack.empty()) {
Node node = stack.pop();
//直接将当前val写入result第一个元素即可。
result.add(0, node.val);
//这里要注意。是node.children。一开始写成了root.children...
//而且与前序遍历不同,这里是从左往右入栈,如果不能想清楚可以在纸上画一下。
List<Node> children = node.children;
if (children != null) {
stack.addAll(children);
}
}
return result;
}
}