Cover image for 面试经典150题 P124 二叉树中的最大路径和

面试经典150题 P124 二叉树中的最大路径和


时间轴

时间轴

2025-10-28

init

DFS

题目:

用 DFS,最大值应该是某一个结点左子树的最大贡献值+右子树的最大贡献值+当前结点的值

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
// Definition for a binary tree node.struct Solution;#[derive(Debug, PartialEq, Eq)]pub struct TreeNode {    pub val: i32,    pub left: Option<Rc<RefCell<TreeNode>>>,    pub right: Option<Rc<RefCell<TreeNode>>>,}impl TreeNode {    #[inline]    pub fn new(val: i32) -> Self {        TreeNode {            val,            left: None,            right: None,        }    }}use std::cell::RefCell;use std::cmp::max;use std::rc::Rc;impl Solution {    pub fn max_path_sum(root: Option<Rc<RefCell<TreeNode>>>) -> i32 {        let mut max_sum = i32::MIN;        Self::dfs(&root, &mut max_sum);        max_sum    }    fn dfs(node: &Option<Rc<RefCell<TreeNode>>>, max_sum: &mut i32) -> i32 {        if let Some(n) = node {            let n = n.borrow();            // 左右子树的最大贡献(如果为负则不如不要)            let left_gain = max(Self::dfs(&n.left, max_sum), 0);            let right_gain = max(Self::dfs(&n.right, max_sum), 0);            // 以当前节点为最高点的路径最大和            let current_path_sum = n.val + left_gain + right_gain;            // 更新全局最大路径和            *max_sum = max(*max_sum, current_path_sum);            // 返回当前节点对父节点的最大贡献(只能选一边)            return n.val + max(left_gain, right_gain);        }        0    }}fn main() {    println!("Hello, world!");}

c++

123456789101112131415161718192021222324252627282930313233
#include <climits>class Solution {private:    int maxSum = INT_MIN;public:    int maxGain(TreeNode* node) {        if (node == nullptr) {            return 0;        }        // 递归计算左右子节点的最大贡献值        // 只有在最大贡献值大于 0 时,才会选取对应子节点        int leftGain = std::max(maxGain(node->left), 0);        int rightGain = std::max(maxGain(node->right), 0);        // 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值        int priceNewpath = node->val + leftGain + rightGain;        // 更新答案        maxSum = std::max(maxSum, priceNewpath);        // 返回节点的最大贡献值        return node->val + std::max(leftGain, rightGain);    }    int maxPathSum(TreeNode* root) {        maxGain(root);        return maxSum;    }};

leetcode hot 100 rewrite

1234567891011121314151617181920212223242526
#include <algorithm>#include <climits>class Solution {    private:        int sum;        int __maxPathSum(TreeNode *root)        {                if (root == nullptr)                        return 0;                int left_sum = __maxPathSum(root->left);                int right_sum = __maxPathSum(root->right);                sum = std::max({ left_sum + right_sum + root->val, root->val, root->val + left_sum,                                 root->val + right_sum, sum });                return std::max(std::max(left_sum, right_sum) + root->val, root->val);        }    public:        int maxPathSum(TreeNode *root)        {                sum = INT_MIN;                __maxPathSum(root);                return sum;        }};
评论加载中…