一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
题目:N 叉树的层序遍历
题目如下图所示,也可以在LeetCode题目中找到此题。
题目解析
题目提供素材
- 一个N叉树。
注意:
n最小等于0,最大等于10000;(树的节点总数在 [0, 10^4] 之间)
树的高度,或者说是深度不会超过1000层。
我的解读
从题目描述的示例中可以看出,输入的是root = [1,null,3,2,4,null,5,6]。
虽说是用null值来分隔节点,但是从代码实际运行,我们是不需要考虑null值的。
因为一整个N叉树已经被解析到Node对象中了。
Node对象的基础类代码已经给出了,代码如下:
```java class Node { public int val; public List children;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, List<Node> _children) {
val = _val;
children = _children;
}
}; ```
其中包含以下属性:
- val(节点值,比如1,2,3)
- children(子节点集合)
- Node无参构造函数,以及两个有参构造方法。
解题思路
我的思路其实很简单,对于数据结构不是很熟悉的朋友们非常友好。数据结构精通的小伙伴也不要喷我,毕竟暴力也是一种美感。
首先要确认,N叉树不为空,也就是Node对象不为空。
在Node对象不为空的情况下,我们需要将每一层的数据进行合并,并且放置List集合中。
这个时候,我使用的是分层的方式解决的,并且在处理每层节点时,传入变量j来标识层数。
a. 在遍历子节点时,先将现有的子节点集合中的值进行合并;(这里合并的时候在Java中可以使用流操作估计能更快些。有待优化)
b. 将合并后的数据根据层数j来存入结果集合中;这里要做一个判断,那就是如果结果集合中还没有这个相应索引的元素,就应该创建一个;反之如果存在,就去直接添加。
c. 然后遍历所有子节点,进行递归调用。
代码在循环和递归的作用下,重复执行步骤a、b、c,直到没有子节点后成功退出,就可以得到最终结果集合了。
代码
```java class Solution {
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> resultList = new ArrayList<>();
if(root != null){
List<Integer> list = new ArrayList<>();
list.add(root.val);
resultList.add(list);
if(root.children != null && root.children.size() > 0){
toList(root.children, resultList, 1);
}
}
return resultList;
}
private void toList(List<Node> children, List<List<Integer>> resultList, int j){
List<Integer> list = new ArrayList<>();
for(int i = 0; i < children.size(); i++){
list.add(children.get(i).val);
}
if(resultList.size() <= j || resultList.get(j)==null){
resultList.add(list);
}else{
resultList.get(j).addAll(list);
}
for(int i = 0; i < children.size(); i++){
if(children.get(i).children != null && children.get(i).children.size() > 0){
toList(children.get(i).children, resultList, j+1);
}
}
}
} ```