【中等】N叉树的层序遍历

题目描述

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例1:
在这里插入图片描述

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例2:
在这里插入图片描述

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

提示:

树的高度不会超过 1000
树的节点总数在 [0, 10^4] 之间

解题思路

和经典的层序遍历类似,每访问一个结点就将其入队。但此题略有不同,需要将每一层的结点单独放在一个列表里,所以定义中间变量 l l l q 0 q0 q0传递信息。
我在写这个题的时候犯了一个低级错误:中间变量 l l l q 0 q0 q0将信息传递过去后,我直接将其clear,但由于是引用传递而非值传递,所以被传递过去的信息也被清空了。可以用new LinkedList<>(q0)的方式申请一块新的内存,再赋值给 q q q,变量 l l l同理。

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        if(root==null)
            return new LinkedList<>();
        List<List<Integer>> list=new ArrayList<>();//返回列表
        List<Integer> l=new LinkedList<>();//每层列表
        Queue<Node> q=new LinkedList<>();//定义队列,保存要访问的结点
        Queue<Node> q0=new LinkedList<>();//中间队列,用以区分每一层
        q.offer(root);
        while(!q.isEmpty()){
            Node n=q.poll();
            l.add(n.val);
            if(n.children!=null)
                for(Node n0:n.children)
                    q0.offer(n0);
            if(q.isEmpty()) {
                list.add(new LinkedList<>(l));
                q=new LinkedList<>(q0);
                l.clear();
                q0.clear();
            }
        }
        return list;
    }
}

测试例程

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }
    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
}

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        if(root==null)
            return new LinkedList<>();
        List<List<Integer>> list=new ArrayList<>();//返回列表
        List<Integer> l=new LinkedList<>();//每层列表
        Queue<Node> q=new LinkedList<>();//定义队列,保存要访问的结点
        Queue<Node> q0=new LinkedList<>();//中间队列,用以区分每一层
        q.offer(root);
        while(!q.isEmpty()){
            Node n=q.poll();
            l.add(n.val);
            if(n.children!=null)
                for(Node n0:n.children)
                    q0.offer(n0);
            if(q.isEmpty()) {
                list.add(new LinkedList<>(l));
                q=new LinkedList<>(q0);
                l.clear();
                q0.clear();
            }
        }
        return list;
    }
    public void initNode(Node root,List<Integer> list){
        int len=list.size();
        if(len==0)
            return;
        Queue<Node> q=new LinkedList<>();//定义队列,保存要访问的结点
        Node n=root;
        int k0=1,k1=0;
//        List<Node> chi=new LinkedList<>();
        for(int i=0;i<len;i++){
            if(list.get(i) !=null){
                if(i==0) {
                    n.val = list.get(i);
                    q.offer(n);
                }
                else {
                    Node tmp=new Node(list.get(i));
                    if(n.children==null)
                        n.children=new LinkedList<>();
                    n.children.add(tmp);
                    q.offer(tmp);
                }
            }
            else {
//                k1++;
                if(q.isEmpty()){
                    break;
                }
                else{
                    n=q.poll();
                }
            }
        }
    }
    public static void main(String[] args){
        List<Integer> list=new LinkedList<>();
        Integer[] a=new Integer[]{1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14};
        for(int i=0;i<a.length;i++){
            list.add(a[i]);
        }
        Solution s=new Solution();
        Node root=new Node();
        s.initNode(root,list);
        List<List<Integer>> l=s.levelOrder(root);
        System.out.println(l);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷冰殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值