二叉树中的最大路径和 · Binary Tree Maximum Path Sum

时间:2021-10-30 14:53:12

[抄题]:

给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)

[思维问题]:

不会写分合法

[一句话思路]:

用两次分治:root2any any2any分一次,左右再分一次。

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

先root-any左右各一次,再用any-any。

二叉树中的最大路径和 · Binary Tree Maximum Path Sum

二叉树中的最大路径和 · Binary Tree Maximum Path Sum

[一刷]:

  1. left right都是resultType类型,要用到helper函数
  2. root2Any any2Any都不是helper中的变量,需要重新定义:左边或右边的any2any, 递归才是加上中间的any2any

[二刷]:

  1. root为空的corner case中,any2any并不是0,而是MIN_VALUE,保证其它任何数都比它大。
  2. 没有理解递归的实质:a = left.a,一定要出现相同的变量才行
  3. helper函数要有返回的类型

[三刷]:

[四刷]:

[五刷]:

[总结]:

[复杂度]:Time complexity: O(n) Space complexity: O(n)

[英文数据结构,为什么不用别的数据结构]:

[其他解法]:

暴力解法 把所有路径找一遍:n^2

[Follow Up]:

root-leaf 就算有负数也得走:直接左右合并

root-any node 有负数可以不走:max(0,max(left,right)) + root.val 结果要和0比,小于0就只有root.val得了

[LC给出的题目变变变]:

Path Sum 有几条路径和相同:dc

Sum Root to Leaf Numbers:连起来再求和

Univalue Path:最长的相同节点路径

和二叉树有关的,都不能用遍历,要用recursion

/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/ public class Solution {
/*
* @param root: The root of binary tree.
* @return: An integer
*/
class resultType {
int root2Any;
int any2Any;
public resultType (int root2Any, int any2Any) {
this.root2Any = root2Any;
this.any2Any = any2Any;
}
}; private resultType helper (TreeNode root) {
if (root == null) {
return new resultType(0, Integer.MIN_VALUE);
} resultType left = helper(root.left);
resultType right = helper(root.right); int root2Any = Math.max(left.root2Any, right.root2Any) + root.val;
root2Any = Math.max(0, root2Any); int any2Any = Math.max(left.any2Any, right.any2Any);
any2Any = Math.max(any2Any, Math.max(0,left.root2Any) + root.val + Math.max(0,right.root2Any)); return new resultType(root2Any, any2Any);
} public int maxPathSum(TreeNode root) {
return helper(root).any2Any;
}
}

相关文章