N叉树的后序遍便
题目
N叉树的后序遍历(力扣:590)
给定一个 N 叉树,返回其节点值的后序遍历。
分析
后续遍历,即先输出孩子节点,后输出跟节点。
我们可以使用递归和遍历两种方式来实现:
递归:用一个全局List来保存结果,从跟节点遍历,如果节点有孩子,则递归孩子节点,最后将节点添加到List中,递归完成后返回list即可。
遍历:使用辅助栈来实现,首先将第一个元素添加到栈,当栈不为空时,弹出栈顶元素,将元素值添加到结果队列中,然后将该点的所有孩子入栈。循环遍历到栈为空为止。这时,得到的结果队列的逆序即为后续遍历结果。
代码实现:递归
/**
* 590. N叉树的后序遍历
*/
private List<Integer> list = new ArrayList<>();
public List<Integer> postorder(Node root) {
if(root == null){
return list;
}
dfs(root);
return list;
}
private void dfs(Node root){
if(root == null){
return;
}
for(int i=0 ;i< root.children.size(); i++){
dfs(root.children.get(i));
}
list.add(root.val);
}
代码实现:遍历
遍历,最后逆序即可:
/**
* 590. N叉树的后序遍历
* @param root
* @return
*/
public List<Integer> postorder2(Node root) {
List<Integer> list = new ArrayList<>();
if(root == null){
return list;
}
Stack<Node> stack = new Stack<>();
stack.push(root);
Node tmp;
while (!stack.isEmpty()){
tmp = stack.pop();
list.add(tmp.val);
for (int i=0;i<tmp.children.size(); i++){
stack.push(tmp.children.get(i));
}
}
Collections.reverse(list);
return list;
}
遍历,将结果添加到第二个辅助栈中,最后将栈元素添加到结果队列,实现逆序:
/**
* 590. N叉树的后序遍历
* @param root
* @return
*/
public List<Integer> postorder3(Node root) {
List<Integer> list = new ArrayList<>();
if(root == null){
return list;
}
Stack<Node> stack = new Stack<>();
Stack<Node> all = new Stack<>();
stack.push(root);
Node tmp;
while (!stack.isEmpty()){
tmp = stack.pop();
all.push(tmp);
for (int i=0;i<tmp.children.size(); i++){
stack.push(tmp.children.get(i));
}
}
while(!all.isEmpty()){
list.add(all.pop().val);
}
return list;
}