二叉树中的最大路径和

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

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

刚看到题目就先入为主的以为最大路径和不是在左边就是在右边,然后用递归实现求单边分支最大值,方法 如下:

// 该方法求解的是当前节点加上左分支 【或】 右分支的最大路径和。
public int oneSideMax(TreeNode root) {
    if (root == null) {
        return 0;
    }

    // 左分支上的最大路径和,注意这里要和0比较,如果小于0的则可以舍弃。
    int left = Math.max(oneSideMax(root.left), 0);
    // 右分支上的最大路径和
    int right = Math.max(oneSideMax(root.right), 0);
    return Math.max(left, right) + root.val;
}

但是跑了用例后,发现错误了。主要原因是最大路径和还有可能出现在左分支加右分支加当前节点上。
故加入对这种情况的处理,这种情况可以在上面的递归中处理。 具体代码如下:

int ans = Integer.MIN_VALUE;	// 用于记录最大路径和
public int oneSideMax(TreeNode root) {
    if (root == null) {
        return 0;
    }

    // 左分支上的最大路径和,注意这里要和0比较
    int left = Math.max(oneSideMax(root.left), 0);
    // 右分支上的最大路径和
    int right = Math.max(oneSideMax(root.right), 0);
	
	// 最关键的两步
	// 在递归过程中,不断比较左右分支加上当前节点的路径和
	int newPath = left + right + root.val;
	// 同已知的最大路径比较
	ans = Math.max(ans, newPath);

	// 注意方法的定义是求单边的和。 
    return Math.max(left, right) + root.val;
}

这种方法的思想是在不断递归的过程中调整目标值,递归的方法可能不是直接计算结果的,但是结果可以在这个递归的过程中计算。
在上述oneSideMax方法运行结束后,ans即是最大的路径和。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值