算法小知识-----04.09-----N叉树的层序遍历

127 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

今日的每日一题直接起飞好吧,又是令人熟悉的题型

N叉树的层序遍历

该题出自力扣的429题 —— N叉树的层序遍历【中等题】

审题

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

image.png

  • 该题的题意十分简单,在二叉树的基础上,子树不止左右子树,变成List列表子树
  • 层序遍历与二叉树的层序遍历并没有大不同
    • 利用双端队列实现,并在开头判断是否为空,如果为空就直接抛出空列表
    • 把当前节点塞进队列尾端
    • 循环整个队列,直到队列为空
      • 计算当前队列的长度,长度 = 这一层所拥有的节点数量
      • 从队列头弹出节点
      • 新增一个列表,存放每一层的值
      • 把每一个子节点分别放进队列的末端
    • 整个循环围绕着队列的末端加入 + 头部弹出,通过每次队列的长度来决定每一层的数量
    • 时间复杂度为O(n),其中 n 是树中包含的节点个数,因为需要遍历整个N叉树
    • 空间复杂度为O(n),即为队列需要使用的空间。在最坏的情况下,队列的长度为两层树,并且子树的节点数量为N -1。

编码

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) {
        ArrayDeque<Node> deque = new ArrayDeque<>();
        List<List<Integer>> lists = new ArrayList<>();
        if(root != null){
            deque.addLast(root);
        }

        while (!deque.isEmpty()){
            int num = deque.size();
            List<Integer> list = new ArrayList<>();
            for (int i = 0;i<num;i++){
                //
                Node child = deque.removeFirst();
                list.add(child.val);
                child.children.forEach(deque::addLast);
            }
            lists.add(list);
        }
        return lists;
    }
}

image.png