二叉树中的最大路径和
https://www.lintcode.com/problem/94/?utm_source=sc-cheatsheet-cyc
描述
给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)
样例
样例 1:
输入:
输出:
解释:
只有一个节点2 样例 2:
输入:
输出:
解释:
样例 3: 输入:
输出:
解释:
解题思路:
有4种情况要考虑 left + root
right + root
root
left + right + root
不断往上传递的值 只可能是 1, 2, 3中的一种 第四种情况只可能保存在 max里面 而不可能在 curr_max
参考横向纵向,向上生长的只能是一个单支,横向的是总体结果。所以对于某个node,纵向更新单支并返回,横向更新结果。
递归
首先,考虑实现一个简化的函数 maxGain(node)
,该函数计算二叉树中的一个节点的最大贡献值,具体而言,就是在以该节点为根节点的子树中寻找以该节点为起点的一条路径,使得该路径上的节点值之和最大。
具体而言,该函数的计算如下。
空节点的最大贡献值等于 。
非空节点的最大贡献值等于节点值与其子节点中的最大贡献值之和(对于叶节点而言,最大贡献值等于节点值)。
根据函数
maxGain
得到每个节点的最大贡献值之后,如何得到二叉树的最大路径和?对于二叉树中的一个节点,该节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值,如果子节点的最大贡献值为正,则计入该节点的最大路径和,否则不计入该节点的最大路径和。维护一个全局变量maxSum
存储最大路径和,在递归过程中更新maxSum
的值,最后得到的maxSum
的值即为二叉树中的最大路径和。
Last updated