N叉树的前序遍历
题目描述
给定一个 N 叉树,返回其节点值的前序遍历。
图示
题解一(java递归)
class Solution {
ArrayList<Integer> list = new ArrayList<Integer>() ;
public List<Integer> preorder(Node root) {
dfs(root);
return list;
}
public void dfs(Node root){
if(root == null){
return;
}
list.add(root.val);
if(root.children == null){
return;
}
for(Node child : root.children){
dfs(child);
}
}
}
详解
- 本题不断递归该节点的子节点,并且在递归之前先将该节点的值存入列表中
Tips
- 与后序遍历不同的是,后序遍历是等遍历完成之后再将节点的值存入列表中,而前序遍历是在开始新的遍历之前就已经将该节点的值存在了列表中。
题解二(java跌代)
class Solution {
List<Integer> list = new ArrayList<>();
Deque<Node> stack = new LinkedList<>();
public List<Integer> preorder(Node root) {
dfs(root);
return list;
}
public void dfs(Node root){
if(root == null){
return;
}
stack.push(root);
Node current;
while(!stack.isEmpty()){
current = stack.pop();
list.add(current.val);
for(int i = current.children.size() - 1; i >= 0; -- i){
stack.push(current.children.get(i));
}
}
}
}
详解
- 本次重点解释将节点压入栈的顺序,其他在【“N叉树的后序遍历”文章 中有详细说明】
- 1>.前序遍历——根节点-子节点(左-右):
for(int i = node.children.size() - 1; i >= 0; – i) {
stack.push(node.children.get(i));
} - 2>.后序遍历——根节点-子节点(右-左):
for(int i = 0; i < node.children.size(); ++ i) {
stack.push(node.children.get(i));
}
或者:
for(Node child : current.children){
stack.push(current)
}
之后再将得到的列表反转也可
Tips
- 注意:在迭代的时候,一定是先将该节点移除栈,并将该节点的值存入列表之后,在将该节点的子节点按一定的顺序移入栈中
- 注意:在迭代法中,与后序遍历不同的是,在后序遍历中,我们是按照【中,右,左】的顺序存入节点的,反转之后可以得到我们想要的结果;而在前序遍历中我们是按照【中,左,右】的顺序存入节点的,直接便可以得到我们想要的结果。
难点:
- 掌握将根节点的子节点按照不同顺序压入栈的方法
声明
- 原作者:E.L.E
- <著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处>
- <欢迎大家评论>