二叉树层序遍历?秒了!

废话不多说,直接上题,涉及到二叉树层序遍历的题目大部分都可以用这个方法:

示例:力扣102 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

在这里插入图片描述

func levelOrder(root *TreeNode) [][]int {
    ans := [][]int{} //用来储存结果
    var level func(*TreeNode,int) //定义函数,方便后续递归调用
    level = func(seed *TreeNode,i int){ // 递归主体
        if seed == nil{
            return
        }
        if len(ans) == i {
			ans = append(ans, []int{}) 
		}
        ans[i] = append(ans[i],seed.Val)
        level(seed.Left,i+1)
        level(seed.Right,i+1)
    }
    level(root,0)
    return ans
}

主要带大家分析一下这段递归的主题

        if seed == nil{
            return
        }

这部分应该没什么问题,如果为空,直接返回,不让他执行后续操作

如果没有这步操作,后续查找seed的Val,Right,Left值的时候,会报空指针异常

 if len(ans) == i {
			ans = append(ans, []int{}) 
		}

初始化每层的数组,因为在一开始创建二维数组的时候并没有进行对每层初始化,这里初始化一下后面才能进行操作

ans[i] = append(ans[i],seed.Val)
level(seed.Left,i+1)
level(seed.Right,i+1)

这三行代码是这个迭代的核心
将当前遍历结果置入到当前层的数组中,并且开启迭代
这个迭代顺序很有讲究,题目要求从左到右我们就先迭代左,再迭代右

这个非常好理解,接下来要开始变形了


练习一 : 力扣429. N 叉树的层序遍历

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

func levelOrder(root *Node) [][]int {
    ans := [][]int{}
    var level func(*Node,int)
    level = func(node *Node,i int){
        if node == nil{
            return
        }
        if len(ans) == i{
            ans = append(ans,[]int{})
        }
        ans[i] = append(ans[i],node.Val)
        for _,v := range node.Children{
            level(v,i+1) //主要差别就在这句
        }
    }
    level(root,0)
    return ans
}

这题将二叉树变成了N叉树,树不止有左右两个子节点,所以我们要依次从左到右迭代,基本跟原题一样,没有难度,过!


练习二:力扣116. 填充每个节点的下一个右侧节点指针

这题跟下一题 117. 填充每个节点的下一个右侧节点指针 II可共用一套方法,放在一起说

给定一个二叉树:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。
初始状态下,所有 next 指针都被设置为 NULL 。

在这里插入图片描述

首先分析:这题是让添加一个next节点指向其下一个右侧节点,我们不妨按照层序遍历的思想,从右往左依次存入节点并将其作为下一个节点的next节点这样此题就得以解决了

func connect(root *Node) *Node {
    ans := []*Node{}
    var level func(*Node,int)
    level = func(node *Node,i int){
        if node == nil{
            return
        }
        if len(ans)==i{
            ans = append(ans,nil)
        }
        node.Next = ans[i]
        ans[i] = node
        level(node.Right,i+1)
        level(node.Left,i+1)
    }
    level(root,0)
    return root
}

没错,层序遍历就是这么简单~

下次文章见~

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值