【leetcode-树】二叉树中的最大路径和

【leetcode-树】二叉树中的最大路径和

题目:

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 1:

输入: [1,2,3]

       1  
      / \
     2   3

输出: 6

示例 2:

输入: [-10,9,20,null,null,15,7]

  -10
   / \
  9  20
    /  \
   15   7

输出: 42

思路:

最大和的路径基本只有以下几种情况:

某个节点自身
形如 d-b-e 这种 以某节点 b 为根节点的”完全子树“(选择的节点要么左右孩子也都加入,要么都不加入)
形如 d-b-a-c-f 这种含有”不完全子树“(如没有加入b的右孩子e,c的右孩子g)
因此,采取递归的思想,先遍历到叶子节点,逐层返回当前分支最大路径和。

如果最大路径是1或者2情况的话,那么是不需要回溯的,也就是说,对于1和2只需要判断root+left+right这一路径和是否为最大路径即可,不必向上层返回值;而3则需要继续判断当前 root+left或者root+right是否为最终路径的左或右分支(如d-b是d-b-a-c-f的左分支),因此需要回溯时需要返回root+left和root+right其中的最大值,如果root的左右孩子都是负数,那么当前子路径就是root节点本身,即返回root即可。

java代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private int res = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        compute(root);
        return res;
    }
    private int compute(TreeNode root){
        if(root == null){
            return 0;
        }
        //经过左节点的路径的最大和
        int lMax = compute(root.left);
        //经过右节点的路径的最大和
        int rMax = compute(root.right);
        //以当前节点为根节点的路径最大和
        res = Math.max(res,Math.max(0,lMax)+Math.max(0,rMax)+root.val);
        //返回 经过当前节点的路径最大和
        return Math.max(0,Math.max(lMax,rMax)+root.val);
    }
}

由于水平有限,文章中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!

你可能感兴趣的:(【leetcode-树】二叉树中的最大路径和)