124. 二叉树中的最大路径和 - 力扣(LeetCode) (leetcode-cn.com)
题目
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其 最大路径和 。
题意
设二叉树上任意一个节点到另一个节点的路径为x,求最大的x。路径中每个节点只能出现一次
思路
贪心
贪心的想法为对于每一个节点,答案可能为四种情况
- 当前节点的值
- 当前节点的值+左儿子的值
- 当前节点的值+右儿子的值
- 当前节点的值+左儿子的值+右儿子的值
因此我们可以递归的处理二叉树,处理每一个节点的每种情况即可
代码
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
#include "algorithm" #include "vector" using namespace std;
struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} };
class Solution { public: int dfs(TreeNode* cur, int &ans){ if(cur == nullptr) return 0; int l = dfs(cur->left, ans); int r = dfs(cur->right, ans); if(l+r+cur->val > ans) ans = l+r+cur->val; if(l+cur->val > ans) ans = l+cur->val; if(r+cur->val > ans) ans = r+cur->val; if(cur->val > ans) ans = cur->val; return max(max(l,r),0)+cur->val; } int maxPathSum(TreeNode* root) { int ans = INT_MIN; dfs(root, ans); return ans; } };
|