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
| pub struct TreeNode {
pub val: i32,
pub left: Option<Box<TreeNode>>,
pub right: Option<Box<TreeNode>>,
}
impl Solution {
pub fn max_sum_bst(root: Option<Box<TreeNode>>) -> i32 {
fn dfs(node: &Option<Box<TreeNode>>, ans: &mut i32) -> (bool, i32, i32, i32) {
if let Some(n) = node {
let (lbst, lmin, lmax, lsum) = dfs(&n.left, ans);
let (rbst, rmin, rmax, rsum) = dfs(&n.right, ans);
if lbst && rbst && n.val > lmax && n.val < rmin {
let sum = lsum + rsum + n.val;
*ans = (*ans).max(sum);
return (true, lmin.min(n.val), rmax.max(n.val), sum);
}
(false, 0, 0, 0)
} else {
(true, i32::MAX, i32::MIN, 0)
}
}
let mut ans = 0;
dfs(&root, &mut ans);
ans
}
}
|