forked from doocs/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution.go
46 lines (46 loc) · 855 Bytes
/
Solution.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
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func findClosestLeaf(root *TreeNode, k int) int {
g := make(map[*TreeNode][]*TreeNode)
var dfs func(root, p *TreeNode)
dfs = func(root, p *TreeNode) {
if root == nil {
return
}
g[root] = append(g[root], p)
g[p] = append(g[p], root)
dfs(root.Left, root)
dfs(root.Right, root)
}
dfs(root, nil)
var q []*TreeNode
for t, _ := range g {
if t != nil && t.Val == k {
q = append(q, t)
break
}
}
seen := make(map[*TreeNode]bool)
for len(q) > 0 {
node := q[0]
q = q[1:]
seen[node] = true
if node != nil {
if node.Left == nil && node.Right == nil {
return node.Val
}
for _, next := range g[node] {
if !seen[next] {
q = append(q, next)
}
}
}
}
return 0
}