LeetCode刷题记录(七):N 叉树的层序遍历

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

题目:N 叉树的层序遍历

题目如下图所示,也可以在LeetCode题目中找到此题。

image.png

题目解析

题目提供素材
  1. 一个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;
}

}; ```

其中包含以下属性:

  1. val(节点值,比如1,2,3)
  2. children(子节点集合)
  3. 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);
        }
    }
}

} ```

执行结果

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

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

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

打赏作者

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

抵扣说明:

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

余额充值