-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtree1.go
132 lines (121 loc) · 2.52 KB
/
tree1.go
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package LeetCode
import (
"fmt"
)
func SSecondWalk(root *TreeNode) {
if root == nil {
return
}
fmt.Println(root.Val)
SSecondWalk(root.Left)
SSecondWalk(root.Right)
}
func SSecondWalk1(root *TreeNode) {
var queue []*TreeNode
queue = append(queue, root)
for len(queue) != 0 {
node := queue[len(queue)-1]
queue = queue[:len(queue)-1]
fmt.Println(node.Val)
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
}
func ThirdWalk(root *TreeNode) {
var queue []*TreeNode
for len(queue) != 0 || root != nil {
for root != nil {
queue = append(queue, root)
root = root.Left
}
node := queue[len(queue)-1]
queue = queue[:len(queue)-1]
fmt.Println(node.Val)
root = node.Right
}
}
func LastWalk1(root *TreeNode) {
var queue []*TreeNode
var lastVisit *TreeNode
for len(queue) != 0 || root != nil {
queue = append(queue, root)
root = root.Left
}
node := queue[len(queue)-1]
if node.Right == nil || node == lastVisit {
queue = queue[:len(queue)-1]
fmt.Println(node.Val)
lastVisit = node
} else {
root = root.Right
}
}
func LevelOrder(root *TreeNode) [][]int {
var queue []*TreeNode
var res [][]int
queue = append(queue, root)
for len(queue) != 0 {
var list []int
l := len(queue)
for i := 0; i < l; i++ {
node := queue[i]
list = append(list, node.Val)
queue = queue[1:]
if node.Left != nil {
queue = append(queue, node.Left)
}
if node.Right != nil {
queue = append(queue, node.Right)
}
}
res = append(res, list)
}
return res
}
// BFS 从0进队列,弹出之后计算上下左右的结果,将上下左右重新进队列进行二层操作
// 0 0 0 0
// 0 x 0 0
// x x x 0
// 0 x 0 0
// 0 0 0 0
// 0 1 0 0
// 1 x 1 0
// 0 1 0 0
// 0 0 0 0
// 0 1 0 0
// 1 2 1 0
// 0 1 0 0
func updateMatrix(matrix [][]int) [][]int {
q := make([][]int, 0)
for i := 0; i < len(matrix); i++ {
for j := 0; j < len(matrix[0]); j++ {
if matrix[i][j] == 0 {
// 进队列
point := []int{i, j}
q = append(q, point)
} else {
matrix[i][j] = -1
}
}
}
directions := [][]int{{0, 1}, {0, -1}, {-1, 0}, {1, 0}}
for len(q) != 0 {
// 出队列
point := q[0]
q = q[1:]
for _, v := range directions {
x := point[0] + v[0]
y := point[1] + v[1]
if x >= 0 && x < len(matrix) && y >= 0 && y < len(matrix[0]) && matrix[x][y] == -1 {
matrix[x][y] = matrix[point[0]][point[1]] + 1
// 将当前的元素进队列,进行一次BFS
q = append(q, []int{x, y})
}
}
}
return matrix
}