PRELOADER

当前文章 : 《LeetCode124二叉树的最大路径和》

10/8/2019 —— 

题目描述

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

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

示例 1:

输入: [1,2,3]

​ 1

​ / \

​ 2 3

输出: 6

示例 2:

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

-10

/ \

9 20

​ / \

15 7

输出: 42

解题思路

递归,每个时刻判断左子树和右子树的值,如果子树的值大于0,则加上子树的值,同时利用全部变量maxpath记录递归过程中的最大值。

先定义一个全局变量来存储计算过程中的最大路径。

写一个函数nowToother(TreeNode* node)

函数有两个作用:

1. 返回从node出发到另一节点的最大路径

2. 更新最大路径(因为函数用用了全局变量maxpath)

(1) node为起点,终点在node的右子树(lmaxpath<0, rmaxpath>0)

(2)node为起点,终点在node的左子树(lmaxpath>0, rmaxpath<0)

(3)起点和终点分别在左右子树,但经过node (lmaxpath<0, rmaxpath>0)

(4)Node即为起点又是终点(lmaxpath<0, rmaxpath<0)

函数原理:

源代码

class Solution { public: ​ int maxpath=INT_MIN;//全局变量,用于存储节点路径的最大值 ​ int nowToother(TreeNode* node){//计算从node节点出发到其他节点的最大值 ​ if(node==NULL)return 0; ​ int temp=node->val;//存储node(出发点的值) ​ int lmaxpath=nowToother(node->left);//计算出发点node左孩子的从左孩子出发到其他节点的最大值 ​ int rmaxpath=nowToother(node->right);//右 ​ if(lmaxpath>0)temp+=lmaxpath;//如果从左孩子出发到其他节点的最大值大于零则把左孩子和node连起来 ​ if(rmaxpath>0)temp+=rmaxpath;//同理也把右边连起来 ​ //注意如果,左右都被连了起来,那么node就不是出发点了 ​ if(maxpath<temp)maxpath=temp;//更新当前最大路径 ​ //用于计算从node出发到另一节点的最大值 ​ return max(node->val,max(node->val+lmaxpath,node->val+rmaxpath)); ​ } ​ int maxPathSum(TreeNode* root) { ​ if(root==NULL)return 0; ​ nowToother(root); ​ return maxpath; ​ } };