N叉树的前序遍历(java)【递归 && 迭代】

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
  • <著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处>
  • <欢迎大家评论>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值