Skip to content

Commit 1c26837

Browse files
committedFeb 23, 2024
level travel
1 parent 31ec97a commit 1c26837

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed
 

‎src/tree/traversal/level_order.rs

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
//! 层序遍历
2+
use datastructure::TreeNode;
3+
use std::cell::RefCell;
4+
use std::rc::Rc;
5+
6+
/// [2583. 二叉树中的第 K 大层和](https://leetcode.cn/problems/kth-largest-sum-in-a-binary-tree/)
7+
pub fn kth_largest_level_sum(root: Option<Rc<RefCell<TreeNode>>>, k: i32) -> i64 {
8+
use std::collections::{BinaryHeap, VecDeque};
9+
10+
let mut heap = BinaryHeap::new();
11+
let mut travel_queue = VecDeque::new();
12+
13+
travel_queue.push_back(root);
14+
15+
// let mut lvl = 0;
16+
while !travel_queue.is_empty() {
17+
let mut lvl_sum = 0i64;
18+
19+
for _ in 0..travel_queue.len() {
20+
if let Some(node) = travel_queue.pop_front().unwrap() {
21+
let node = node.borrow();
22+
lvl_sum += node.val as i64;
23+
if let Some(left) = &node.left {
24+
travel_queue.push_back(Some(left.clone()));
25+
}
26+
if let Some(right) = &node.right {
27+
travel_queue.push_back(Some(right.clone()));
28+
}
29+
}
30+
}
31+
// println!("lvl: {}, lvl_sum: {}", lvl, lvl_sum);
32+
heap.push(lvl_sum);
33+
// lvl += 1;
34+
}
35+
// dbg!("heap", &heap);
36+
if heap.len() < k as usize {
37+
-1
38+
} else {
39+
heap.into_sorted_vec()
40+
.into_iter()
41+
.rev()
42+
.nth(k as usize - 1)
43+
.unwrap()
44+
}
45+
}
46+
47+
#[cfg(test)]
48+
mod tests {
49+
use super::*;
50+
use macros::tree;
51+
52+
#[test]
53+
fn test_kth_largest_level_sum() {
54+
struct TestCase {
55+
tree: Option<Rc<RefCell<TreeNode>>>,
56+
k: i32,
57+
expected: i64,
58+
}
59+
vec![
60+
TestCase{
61+
tree: tree!{val:5, left: {val: 8, left: {val: 2, left: {val: 4}, right: {val: 6}}, right: {val: 1}}, right: {val: 9, left: {val: 3}, right: {val: 7}}},
62+
k: 2,
63+
expected: 13,
64+
},
65+
TestCase{
66+
tree: tree!{val: 1, left: {val: 2, left: {val:3}}},
67+
k: 1,
68+
expected: 3
69+
}
70+
71+
].into_iter().enumerate().for_each(|(idx, TestCase{tree, k, expected})|{
72+
let actual = kth_largest_level_sum(tree.clone(), k);
73+
assert_eq!(actual, expected, "Test case {} failed", idx+1);
74+
});
75+
}
76+
}

‎src/tree/traversal/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
pub mod in_order;
44
pub mod post_order;
55
pub mod pre_order;
6-
pub mod no_class;
6+
pub mod no_class;
7+
pub mod level_order;

0 commit comments

Comments
 (0)