给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
思路:层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。
需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。
大体流程就是:首先根结点先入队,然后根据队列的长度来遍历队列中的所有元素,在每个元素出队的同时,将其子节点依次从左倒右入队,记录当前节点的值。这样就能做到一层一层的遍历。
代码:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func levelOrder(root *TreeNode) (res [][]int) {
if root==nil{
return
}
queue:=list.New()
//根结点如队列
queue.PushBack(root)
for queue.Len()>0{
length:=queue.Len()
//临时切片变量接收每一层的值
var tmp []int
//遍历当前队列中的元素
for i:=0;i<length;i++{
//出队列
node:=queue.Remove(queue.Front()).(*TreeNode)
//入队列
if node.Left!=nil{
queue.PushBack(node.Left)
}
if node.Right!=nil{
queue.PushBack(node.Right)
}
//将值添加进结果切片中
tmp=append(tmp,node.Val)
}
res=append(res,tmp)
}
//反转结果集
// Len:=len(res)
// for i:=0;i<Len/2;i++{
// res[i],res[Len-i-1]=res[Len-i-1],res[i]
// }
return
}