【刷题日记】429. N 叉树的层序遍历

1,903 阅读4分钟

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

【刷题日记】429. N 叉树的层序遍历

本次刷题日记的第 27 篇,力扣题为:429. N 叉树的层序遍历中等

一、题目描述:

今天来的每日一题是树类的题目,一般来说,如果是二叉树的题目,相对来说是比较好理解,比较好做的,虽然看着是一个中等题,其实实现方式比较明确也比较好理解,可能没有练习过二叉树的会感觉到无从下手吧

我们一起来看看吧

二、这道题考察了什么思想?你的思路是什么?

我们仔细看看今日一题给了我们哪些重要的信息:

  • 题目中给出的树是多叉树,和二叉树不一样,一个节点最多只会有 2 个孩子节点,一个左孩子,一个右孩子,但是多叉树是可以有多个孩子节点的
  • 需要我们对树层序遍历,见名知意,就是一层一层的遍历即可

之前我们刷过二叉树的题目,例如遍历树的前序,后序,中序,还记得我们使用的是递归的方式,是 dfs 深度优先算法

那么这一次的层序遍历,是不是深度优先算法呢?

我们可以来推演一下:

按照题目中的示例:root = [1,null,3,2,4,null,5,6]

主要是我们要看明白下面这个图

遍历这棵树,咱们是一层一层遍历的,先遍历第一层

image-20220408232922914

再遍历第二层,我们知道第二层是第一层的子节点,那么我们在遍历第一层的时候,就可以用一个帮助空间来将第一层的所有子节点的地址先存起来,当遍历第二层的时候就可以用

当遍历第三层的时候,做法也是和遍历第二层的方式一样

那么当第三层遍历完毕的时候,我们发现,第三层的节点中,已经没有哪个节点有孩子节点了,因此,我们则认为是遍历完毕

那么最后,我们将每一层的节点数字,输出出来即可

剩下的就是翻译上述思路的过程了,思路清楚了,写代码那都是 soso 滴

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码

编码如下:

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Children []*Node
 * }
 */

func levelOrder(root *Node)(res  [][]int) {
    // 如果传入的根节点是 空,那么就不存在层序遍历了
    if root == nil{
        return
    }
    // 定义一个队列,先将根节点放入队头
    que := []*Node{root}

    for que != nil {
        tmp := que
        que = nil
        // 定义一个切片,主要是存放本层的 节点数据
        tmpLevel := []int{}

        for _,val := range tmp {
            // 存放本层节点数据
            tmpLevel = append(tmpLevel, val.Val)
            // 将当前节点的子节点入队列
            que = append(que, val.Children...)
        }
        // 将本层节点加入到结果集
        res = append(res, tmpLevel)
    }
    
    return
}

可以看到节点的结构是这样的

每一个节点都有自己的值域和指针域,指针域存放的是一个切片,里面存放的是自己的多个子节点的地址

那么通过上述编码,我们知道,是将这棵树的每一个节点,按照一层一层的将节点放入队列中,先进先出,一层一层的遍历完毕之后,我们即可得到每一层的数据结果

这其实就是广度优先算法 BFS

相信通过查看上述编码的备注,应该的都是看的明白的

四、总结:

这里的时间复杂度其实也能看的出来,就是树中包含节点的个数,是 O(n),我们在遍历的过程中,就是遍历队列的长度,正好是所有节点的总数,因此,空间复杂度也是 O(n)

原题地址:429. N 叉树的层序遍历

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~