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;
}