LeetCode 30 days Challenge - Day 29
本系列将对LeetCode新推出的30天算法挑战进行总结记录,旨在记录学习成果、方便未来查阅,同时望为广大网友提供帮助。
Binary Tree Maximum Path Sum
Given a non-empty binary tree, find the maximum path sum.
For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.
Example 1:
1 | Input: [1,2,3] |
Example 2:
1 | Input: [-10,9,20,null,null,15,7] |
Solution
题目要求分析:给定一棵非空二叉树,求其中最大路径和。注意此处的路径不一定经过根结点,路径至少有一个节点。
解法:
本题需要注意的是,存在负数结点值,传统的递归思想无法满足题目要求。
对于当前结点,维护一个最大值变量res,我们需要考虑:
路径不允许分叉,那么若当前结点存在父节点、经过当前结点、还要向父节点走的路径只可能经过当前结点的左右子树之一,该定义是递归的。在下文,称这种情况为
无分叉子树
最终经过当前结点的最大路径只有四种情况:
经过当前结点、不经过子树:
无分叉子树最大路径和都为负数
res = max(res, node->val + max(0, l) + max(0, r));
经过当前结点、当前节点的左子树、当前节点的右子树:
两颗无分叉子树最大路径和都不为负数
res = max(res, node->val + max(0, l) + max(0, r));
经过当前结点、当前节点的左子树:
右无分叉子树最大路径和不为负数
更新无分叉子树的最大路径和:
node->val += max(0, max(l, r));
经过当前结点、当前节点的右子树:
左无分叉子树最大路径和不为负数
更新无分叉子树的最大路径和:
node->val += max(0, max(l, r));
按以上思路,题解如下:
1 | int getSubPathSum(TreeNode* node, int &res) { |
传送门:Binary Tree Maximum Path Sum
Karl