Skip to content

Commit 92dabaf

Browse files
committed
package er_cha_sou_suo_shu_de_di_kda_jie_dian_lcof
1 parent 12731da commit 92dabaf

File tree

3 files changed

+88
-23
lines changed

3 files changed

+88
-23
lines changed

er-cha-shu-ren-wu-diao-du/index.ts

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
1-
import { TreeNode } from "../binary-tree-inorder-traversal/TreeNode.ts";
2-
3-
function minimalExecTime(root: TreeNode | null) {
4-
const res = execTime(root);
5-
return res[0];
6-
}
7-
8-
function execTime(node: TreeNode | null): [number, number] {
9-
if (node == null) {
10-
// [0]执行完当前节点最小耗时,[1]当前node为根的时间串行之和
11-
return [0, 0];
12-
}
13-
// 获取左右子树的值
14-
const leftTime = execTime(node.left);
15-
const rightTime = execTime(node.right);
16-
// 左右子树节点之和
17-
const sum = leftTime[1] + rightTime[1];
18-
// 当前节点执行完的最小消耗时间
19-
const minTime =
20-
Math.max(Math.max(leftTime[0], rightTime[0]), sum / 2) + node.val;
21-
return [minTime, sum + node.val];
22-
}
23-
export default minimalExecTime;
1+
import { TreeNode } from "../binary-tree-inorder-traversal/TreeNode.ts";
2+
3+
function minimalExecTime(root: TreeNode | null) {
4+
const res = execTime(root);
5+
return res[0];
6+
}
7+
8+
function execTime(node: TreeNode | null): [number, number] {
9+
if (node == null) {
10+
// [0]执行完当前节点最小耗时,[1]当前node为根的时间串行之和
11+
return [0, 0];
12+
}
13+
// 获取左右子树的值
14+
const leftTime = execTime(node.left);
15+
const rightTime = execTime(node.right);
16+
// 左右子树节点之和
17+
const sum = leftTime[1] + rightTime[1];
18+
// 当前节点执行完的最小消耗时间
19+
const minTime = Math.max(Math.max(leftTime[0], rightTime[0]), sum / 2) +
20+
node.val;
21+
return [minTime, sum + node.val];
22+
}
23+
export default minimalExecTime;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package er_cha_sou_suo_shu_de_di_kda_jie_dian_lcof
2+
3+
import (
4+
"testing"
5+
6+
"github.com/masx200/leetcode-test/utils"
7+
"gotest.tools/v3/assert"
8+
)
9+
10+
var TreeNodeLeetCodeParse = utils.TreeNodeLeetCodeParse
11+
12+
func TestKthLargest(t *testing.T) {
13+
assert.Equal(t, 4, (kthLargest(TreeNodeLeetCodeParse("[3,1,4,null,2]"), 1)))
14+
assert.Equal(t, 4, (kthLargest(TreeNodeLeetCodeParse(" [5,3,6,2,4,null,null,1]"), 3)))
15+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package er_cha_sou_suo_shu_de_di_kda_jie_dian_lcof
2+
3+
import serialize_and_deserialize_binary_tree "github.com/masx200/leetcode-test/serialize-and-deserialize-binary-tree"
4+
5+
import (
6+
"errors"
7+
)
8+
9+
func KthLargest(root *TreeNode, k int) int {
10+
return kthLargest(root, k)
11+
}
12+
13+
type TreeNode = serialize_and_deserialize_binary_tree.TreeNode
14+
15+
func kthLargest(root *TreeNode, k int) int {
16+
i := 1
17+
gen := ReverseInOrderIterator(root)
18+
19+
for v := range gen {
20+
21+
if i == k {
22+
return v
23+
}
24+
i++
25+
}
26+
panic(errors.New("unreachable"))
27+
}
28+
func ReverseInOrderIterator(root *TreeNode) (gen chan int) {
29+
gen = make(chan int)
30+
31+
if root == nil {
32+
close(gen)
33+
return
34+
}
35+
go func() {
36+
WriteAll(gen, ReverseInOrderIterator(root.Right))
37+
38+
gen <- root.Val
39+
WriteAll(gen, ReverseInOrderIterator(root.Left))
40+
close(gen)
41+
}()
42+
43+
return
44+
}
45+
func WriteAll(target chan int, source chan int) {
46+
47+
for v := range source {
48+
target <- v
49+
}
50+
}

0 commit comments

Comments
 (0)