废话不多说,直接上题,涉及到二叉树层序遍历的题目大部分都可以用这个方法:
示例:力扣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
}
没错,层序遍历就是这么简单~
下次文章见~