Skip to content

Commit 78fbe7d

Browse files
committed
Update index.go
1 parent 92dabaf commit 78fbe7d

File tree

1 file changed

+29
-15
lines changed
  • er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof

1 file changed

+29
-15
lines changed
Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package er_cha_sou_suo_shu_de_di_kda_jie_dian_lcof
22

3-
import serialize_and_deserialize_binary_tree "github.com/masx200/leetcode-test/serialize-and-deserialize-binary-tree"
4-
53
import (
4+
"context"
65
"errors"
6+
7+
serialize_and_deserialize_binary_tree "github.com/masx200/leetcode-test/serialize-and-deserialize-binary-tree"
78
)
89

910
func KthLargest(root *TreeNode, k int) int {
@@ -14,8 +15,9 @@ type TreeNode = serialize_and_deserialize_binary_tree.TreeNode
1415

1516
func kthLargest(root *TreeNode, k int) int {
1617
i := 1
17-
gen := ReverseInOrderIterator(root)
18-
18+
ctx, cancel := context.WithCancel(context.Background())
19+
gen := ReverseInOrderIterator(ctx, root)
20+
defer cancel()
1921
for v := range gen {
2022

2123
if i == k {
@@ -25,26 +27,38 @@ func kthLargest(root *TreeNode, k int) int {
2527
}
2628
panic(errors.New("unreachable"))
2729
}
28-
func ReverseInOrderIterator(root *TreeNode) (gen chan int) {
30+
func ReverseInOrderIterator(ctx context.Context, root *TreeNode) (gen chan int) {
2931
gen = make(chan int)
3032

31-
if root == nil {
32-
close(gen)
33-
return
34-
}
3533
go func() {
36-
WriteAll(gen, ReverseInOrderIterator(root.Right))
3734

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+
4149
}()
4250

4351
return
4452
}
45-
func WriteAll(target chan int, source chan int) {
53+
func WriteAll(ctx context.Context, target chan int, source chan int) {
4654

4755
for v := range source {
48-
target <- v
56+
select {
57+
case <-ctx.Done():
58+
return
59+
default:
60+
target <- v
61+
}
62+
4963
}
5064
}

0 commit comments

Comments
 (0)