一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
今日的每日一题直接起飞好吧,又是令人熟悉的题型
N叉树的层序遍历
该题出自力扣的429题 —— N叉树的层序遍历【中等题】
审题
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
- 该题的题意十分简单,在二叉树的基础上,子树不止左右子树,变成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;
}
}