给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点
图中划红线的表示路径,此题中要寻找的路径必须是能够一笔画成的,这样才满足从树中的任意一点能到达另外一个任意一点的最大值
所以要招的最大路径就是当前节点加上左子树的最大路径(可为0)加上右子树的最大路径(可为0),这样形成了递归,每次递归返回的值为当前检查的节点的最大路径和,并非最终最大路径和。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int max_path = -9999;//先定义最大的路径,
//使得第一次检索的路径成为最大值,之后能继续进行比较
public int maxPathSum(TreeNode root) {
find(root);
return max_path;
}
public int find(TreeNode root){
if(root == null){
return 0;
}
int left = Math.max(find(root.left),0);//找当前节点左子树的最大路径
int right = Math.max(find(root.right),0);//找当前节点右子树的最大路径
max_path = Math.max(max_path,left+right+root.val);//将当前节点的最大路径与之前找出的做大路径作比较
return Math.max(root.val + left, root.val+right);//返回的是上一个节点的左子树或右子树的最大路径
}
}