leetcode 102. 二叉树的层序遍历

102. 二叉树的层序遍历 - 力扣(Leetcode)

使用slice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func levelOrder(root *TreeNode) [][]int {
// 层序遍历 使用size 记录每层数组 queue node 队列

res := make([][]int, 0)
queue := make([]*TreeNode, 0)

if root != nil {
queue = append(queue, root)
} else {
return res
}


for len(queue) != 0 {
size := len(queue)
levels := make([]int, 0)

for i:= 0; i < size; i++ {
node := queue[0]
queue = queue[1:len(queue)] //切掉元素0

levels = append(levels, node.Val) // 添加元素
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
res = append(res, levels)
}
return res
}

使用list

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
func levelOrder(root *TreeNode) [][]int {
res := [][]int{}
if root == nil{//防止为空
return res
}
queue := &list.List{}
queue.PushBack(root)

for queue.Len() > 0 {
length := queue.Len() //保存当前层的长度,然后处理当前层(十分重要,防止添加下层元素影响判断层中元素的个数)
var levelQueue []int
fmt.Println(length)
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)
}
levelQueue = append(levelQueue, node.Val) //将值加入本层切片中
}
res = append(res, levelQueue) //放入结果集
}

return res
}

leetcode 102. 二叉树的层序遍历
https://leiqi.top/2023-05-23-a419f5d1c6af.html
作者
Lei Qi
发布于
2023年5月23日
许可协议