java编程求二叉树最大路径问题代码分析

作者:Felix Fang 时间:2023-03-16 20:44:16 

题目:

Binary Tree Maximum Path Sum

Given a binary tree, find the maximum path sum.

The path may start and end at any node in the tree.

For example:
Given the below binary tree,


   1
  / \
  2  3

Return 6.

节点可能为负数,寻找一条最路径使得所经过节点和最大。路径可以开始和结束于任何节点但是不能走回头路。

这道题虽然看起来不同寻常,但是想一下,可以发现不外乎二叉树的遍历+简单的动态规划思想。

我们可以把问题拆分开:即便最后的最大路径没有经过根节点,它必然也有自己的“最高点”,因此我们只要针对所有结点,求出:如果路径把这个节点作为“最高点”,路径最长可达多少?记为max。然后在max中求出最大值MAX即为所求结果。和“求整数序列中的最大连续子序列”一样思路。

下面就是找各个“最高点”对应的max之间的关系了。

我们拿根节点为例,对于经过根节点的最大路径的计算方式为:

我们找出左子树中以左孩子为起点的最大路径长度a,和右子树中以右孩子为起点的最大路径长度b。然后这个点的max=MAX(a+b+node.val,a+node.val,b+node.val,node.val)

因此我们定义一个函数来算上面的a或者b,它的参数是一个节点,它的返回值是最大路径长度,但是这个路径的起点必须是输入节点,而且路径必须在以起点为根节点的子树上。

那么函数func(node)的return值可以这样定义:returnMAX(func(node.left)+node.val,func(node.right)+node.val,node.val)

终止条件是node==null,直接返回0。

接着我们发现上述计算max和求出MAX的过程完全可以放到func(node)里去。

按照这个思路的代码,maxPathSumCore就是上面func(node)的实现:


/**
* Definition for binary tree
* struct TreeNode {
*   int val;
*   TreeNode *left;
*   TreeNode *right;
*   TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
 int maxPathSum(TreeNode *root) {
maxPathSumCore(root);
return MAX;
}
int maxPathSumCore(TreeNode *node) {
if(NULL == node) return 0;
int a = maxPathSumCore(node -> left);
int b = maxPathSumCore(node -> right);
if((a+b+node->val) > MAX) MAX = (a+b+node->val);
if((a+node->val) > MAX) MAX = (a+node->val);
if((b+node->val) > MAX) MAX = (b+node->val);
if(node->val > MAX) MAX = node->val;
int maxViaThisNode = ((a + node->val) > node->val ? (a + node->val) : node->val);
return (maxViaThisNode > (b + node->val) ? maxViaThisNode : (b + node->val));
}
private:
 int MAX= -99999999;
}
;

时间复杂度 O(n),n为总节点数。

总结

来源:https://www.cnblogs.com/felixfang/p/3637984.html

标签:二叉树,java
0
投稿

猜你喜欢

  • SpringBoot统一功能处理的方式详解

    2021-08-17 10:46:07
  • java 实现截取字符串并按字节分别输出实例代码

    2021-08-28 08:10:44
  • 详解Java读取Jar中资源文件及示例代码

    2021-07-12 11:18:52
  • Android编程计算函数时间戳的相关方法总结

    2023-05-27 18:29:57
  • 带你了解Java的类和对象

    2022-05-08 09:10:21
  • 一文搞懂Mybatis-plus的分页查询操作

    2023-11-25 10:23:17
  • Java编程调用微信接口实现图文信息推送功能

    2023-11-25 07:20:47
  • Java实现中文算数验证码的实现示例(算数运算+-*/)

    2023-10-23 03:08:09
  • C#实现将网址生成二维码图片方法介绍

    2022-08-14 02:31:49
  • unity实现贴图矩阵运算(旋转平移缩放)

    2022-07-27 13:53:41
  • Android中使用TextView实现高仿京东淘宝各种倒计时效果

    2021-05-26 21:32:26
  • java通过方向键控制小球移动的小游戏

    2023-11-10 05:25:59
  • 一款适用于Android平台的俄罗斯方块

    2023-02-25 02:38:35
  • 完美解决idea创建文件时,文件不分级展示的情况

    2022-01-01 22:10:19
  • android实现简单音乐播放器

    2021-06-28 22:07:26
  • C# 使用CancellationTokenSource取消多线程

    2023-11-15 00:31:54
  • Android RecyclerView实现下拉刷新和上拉加载

    2023-07-05 21:50:38
  • Android实现Activity水平和垂直滚动条的方法

    2021-07-04 13:06:06
  • C#使用符号表实现查找算法

    2022-08-07 01:16:45
  • c# DevExpress gridcontrol日期行的显示格式设置

    2022-07-11 05:28:52
  • asp之家 软件编程 m.aspxhome.com