一天一大 leet(二叉树中的最大路径和)难度:困难 DAY-21

20200621

img

题目(难度:困难):

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

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

示例

  • 示例 1
输入: [1,2,3]

       1
      / \
     2   3

输出: 6
  • 示例 2
输入: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

输出: 42

抛砖引玉

img

使用递归出来二叉树

  • 任取树中的一个节点,有两个选择,向左累计求和或者向右累计求和
  • 借用递归,假设已经知道左侧的和右侧的和,sum(node.left),sum(node.right)
  • 那如果结果路径中包含这个节点,和的组成是:
    s u m ( ) + n o d e . v a l + M a t h . m a x ( ) sum(前节点和)+node.val+Math.max(节点左侧和,节点右侧和)
/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxPathSum = function(root) {
	let _result = -Number.MAX_VALUE;
	sum_node(root)
	function sum_node(node) {
		if (node === null) return 0;
		let left = Math.max(sum_node(node.left), 0);
		let right = Math.max(sum_node(node.right), 0);
		_result = Math.max(_result, left + right + node.val);
		return node.val + Math.max(left, right);
	}
	return _result
};

其他解法

得到节点左侧右侧和的逻辑是一样
只是记录值的形式不同,
把当前节点能得到的最大和的值推送到数组中,再从数组中捡出最大值

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxPathSum = function(root) {
    let resultArr = [];
    let helper = function(node){
        if(node == null) return 0;
        let leftPathVal = Math.max(helper(node.left), 0);
        let rightPathVal = Math.max(helper(node.right), 0);
        resultArr.push(leftPathVal+rightPathVal+node.val)
        return Math.max(leftPathVal,rightPathVal)+node.val;
    }
    resultArr.push(helper(root));
    return Math.max.apply(null,resultArr);
};

博客: 小书童博客(http://gaowenju.com)

公号: 坑人的小书童
坑人的小书童

猜你喜欢

转载自blog.csdn.net/gaowenju1991/article/details/106883489