经典面试算法题:二叉树中的最大路径和

题目

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

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

示例 1:

输入: [1,2,3]

       1
      / \
     2   3

输出: 6
示例 2:

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

   -10
   / \
  9  20
    /  \
   15   7

输出: 42

思路

通过递归的方式实现

初始化 max_sum 为最小可能的整数。

实现 getMax(node) 检查是继续旧路径还是开始新路径:

边界情况:如果节点为空,那么最大权值是 0 。

对该节点的所有孩子递归调用 getMax,计算从左右子树的最大权值:left = max(max(node.left), 0) 和 right = max(getMax(node.right), 0)。

实现

 

private int max_sum = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        getMax(root);
        return res;
    }

    private int getMax(TreeNode root) {
        if (root == null) {
            return 0;
        }

        int left = Math.max(0, getMax(root.left));
        int right = Math.max(0, getMax(root.right));

        max_sum = Math.max(max_sum, root.val + left + right);

        return Math.max(left, right) + root.val;
    }

 

你可能感兴趣的:(经典面试算法题:二叉树中的最大路径和)