层序遍历(Level-order Traversal)
一句话说明
层序遍历就是按层推进的 BFS,队列里装的始终是“下一批要处理的节点”。
(附件 bfs-layer-traversal.gif 未随站点发布)
Go 代码:分层输出
func levelOrder(root *TreeNode) [][]int {
if root == nil {
return nil
}
queue := []*TreeNode{root}
result := [][]int{}
for len(queue) > 0 {
size := len(queue)
level := make([]int, 0, size)
for i := 0; i < size; i++ {
node := queue[0]
queue = queue[1:]
level = append(level, node.Val)
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
result = append(result, level)
}
return result
}为什么要先固定 size
因为本层节点处理时会不断把下一层节点塞进队尾,不先记住当前长度,就分不清层与层。
Go 代码:右视图
func rightSideView(root *TreeNode) []int {
if root == nil {
return nil
}
queue := []*TreeNode{root}
result := []int{}
for len(queue) > 0 {
size := len(queue)
for i := 0; i < size; i++ {
node := queue[0]
queue = queue[1:]
if i == size-1 {
result = append(result, node.Val)
}
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
}
return result
}