1
1
package er_cha_sou_suo_shu_de_di_kda_jie_dian_lcof
2
2
3
- import serialize_and_deserialize_binary_tree "github.com/masx200/leetcode-test/serialize-and-deserialize-binary-tree"
4
-
5
3
import (
4
+ "context"
6
5
"errors"
6
+
7
+ serialize_and_deserialize_binary_tree "github.com/masx200/leetcode-test/serialize-and-deserialize-binary-tree"
7
8
)
8
9
9
10
func KthLargest (root * TreeNode , k int ) int {
@@ -14,8 +15,9 @@ type TreeNode = serialize_and_deserialize_binary_tree.TreeNode
14
15
15
16
func kthLargest (root * TreeNode , k int ) int {
16
17
i := 1
17
- gen := ReverseInOrderIterator (root )
18
-
18
+ ctx , cancel := context .WithCancel (context .Background ())
19
+ gen := ReverseInOrderIterator (ctx , root )
20
+ defer cancel ()
19
21
for v := range gen {
20
22
21
23
if i == k {
@@ -25,26 +27,38 @@ func kthLargest(root *TreeNode, k int) int {
25
27
}
26
28
panic (errors .New ("unreachable" ))
27
29
}
28
- func ReverseInOrderIterator (root * TreeNode ) (gen chan int ) {
30
+ func ReverseInOrderIterator (ctx context. Context , root * TreeNode ) (gen chan int ) {
29
31
gen = make (chan int )
30
32
31
- if root == nil {
32
- close (gen )
33
- return
34
- }
35
33
go func () {
36
- WriteAll (gen , ReverseInOrderIterator (root .Right ))
37
34
38
- gen <- root .Val
39
- WriteAll (gen , ReverseInOrderIterator (root .Left ))
40
- close (gen )
35
+ defer close (gen )
36
+ if root == nil {
37
+
38
+ return
39
+ }
40
+ WriteAll (ctx , gen , ReverseInOrderIterator (ctx , root .Right ))
41
+ select {
42
+ case <- ctx .Done ():
43
+ return
44
+ default :
45
+ gen <- root .Val
46
+ }
47
+ WriteAll (ctx , gen , ReverseInOrderIterator (ctx , root .Left ))
48
+
41
49
}()
42
50
43
51
return
44
52
}
45
- func WriteAll (target chan int , source chan int ) {
53
+ func WriteAll (ctx context. Context , target chan int , source chan int ) {
46
54
47
55
for v := range source {
48
- target <- v
56
+ select {
57
+ case <- ctx .Done ():
58
+ return
59
+ default :
60
+ target <- v
61
+ }
62
+
49
63
}
50
64
}
0 commit comments