题目链接:
力扣https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/
【递归】
class Solution {
List<Integer> ans =new ArrayList<>();
public void dfs(Node node){
if(node != null){
for(Node nd: node.children){
dfs(nd);
}
ans.add(node.val);
}
}
public List<Integer> postorder(Node root) {
dfs(root);
return ans;
}
}
【迭代】这就用到了栈了,后续遍历是左右根,所以入栈的时候是根右左,但是根又被入进去一次,那么何时把他弹出永不再用呢,可以用一个map来记录是否已经将这个节点的孩子全都压入栈了。
class Solution {
public List<Integer> postorder(Node root) {
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
Stack<Node> stack = new Stack<>();
stack.push(root);
int n, i;
Map<Node, Boolean> map = new HashMap<>();
Node cur;
while(!stack.empty()){
cur = stack.pop();
if(map.containsKey(cur)){
ans.add(cur.val);
}else{
n = cur.children.size();
stack.push(cur);
for(i = n - 1; i >= 0; i--){
stack.push(cur.children.get(i));
}
map.put(cur, true);
}
}
// for(Map.Entry<Node, Boolean> entry: map.entrySet()){
// System.out.print(entry.getKey().val);
// System.out.println(entry.getValue());
// }
return ans;
}
}