124. Binary Tree Maximum Path Sum

https://www.cnblogs.com/grandyang/p/4280120.html

如果你要计算加上当前节点的最大path和,这个节点的左右子树必定是纯左右树(即没有拐点),

用另一个参数保留整个二叉树的最大path和,然后计算每一个以当前节点为拐点的路径和并且不断更新整个二叉树的最大值

函数的返回值是纯左右子树的最大path,没有拐点

这个题目给root定位为非空,所以直接这样写可以。如果root为空,这样写就会返回INT_MIN这个值,解决办法就是在最开始加是否为空的判断。

class Solution {
public:
int maxPathSum(TreeNode* root) {
int res = INT_MIN;
maxpath(root,res);
return res;
}
int maxpath(TreeNode* root,int &res){
if(root == NULL)
return ;
int left = max(,maxpath(root->left,res));
int right = max(,maxpath(root->right,res));
res = max(res,left + right + root->val);
return max(left,right) + root->val;
}
};

注意:分的过程中,left、right的迭代都使用了同一个res作为参数传入,而自己实现的平衡二叉树使用了两个不同的参数。

      首先使用同一个是没有错误的,因为这个题,无论左右子树其实都保存的同一个最大值,无需分别对待。而平衡二叉树中左右子树的深度不一样,使用不同的参数也合理

自己写的一个版本:

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxPathSum(TreeNode* root) {
int sum = INT_MIN;
maxPathSum(root,sum);
return sum;
}
int maxPathSum(TreeNode* root,int& sum){
if(!root)
return ;
int sum1 = sum,sum2 = sum;
int left = max(,maxPathSum(root->left,sum1));
int right = max(,maxPathSum(root->right,sum2));
sum = max(left + right + root->val,max(sum1,sum2));
return max(left,right) + root->val;
}
};

必须注意与0比较,因为有负数的情况,可以不加left、right。

必须是INT_MIN,这样可以排除一个负数做根节点,没有左右子树的情况,必须[-3]

这种写法是会超时的,因为你递归了两次;

/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxPathSum(TreeNode* root) {
if(!root)
return -;
int maxSum = INT_MIN;
maxPathSum(root,maxSum);
return maxSum;
}
int maxPathSum(TreeNode* root,int& maxSum){
if(!root)
return ;
int left = maxPathSum(root->left,maxSum) > ? maxPathSum(root->left,maxSum) : ;
int right = maxPathSum(root->right,maxSum) > ? maxPathSum(root->right,maxSum) : ;
maxSum = max(maxSum,left + right + root->val);
return root->val + max(left,right);
}
};
class Solution {
public:
bool isBalanced(TreeNode* root) {
int depth = ;
return Balanced(root,depth);
}
bool Balanced(TreeNode* root,int& depth){
if(root == NULL){
depth = ;
return true;
}
int left,right;
if(Balanced(root->left,left) && Balanced(root->right,right)){
int gap = left - right;
if(gap <= && gap >= -){
depth = left > right ? left + : right + ;
return true;
}
}
return false;
}
};

124题和543题很相似,因为两者实质上都是判断拐点的问题,用返回值表示纯拐点的值,用res值记录最大值就可以。

两者不同的是,124需要加每个节点的值,543是算直径。

543. Diameter of Binary Tree(直径)

https://blog.csdn.net/laputafallen/article/details/80147877

首先明确这里的直径是相当于连接的线的个数,比如4个节点,那直径就是3。所以对于一个节点,他的直径就是他的左右节点的高度和。但是最长的直径不一定是经过根节点的,比如题目中[1,2,3,4,5]这种情况,你如果把4、5都拉长一个,那最长的那个直径对应的根节点应该是2。所以每次求左右子树的高度,然后再跟最大的直径比就好了。

注意:直径是连线的个数,不是节点的个数,比如1、2、3、4连起来,有4个节点,但是实际上只有3条线在连,直径为3,不为4

原始代码:

class Solution {
public:
int diameterOfBinaryTree(TreeNode* root) {
diameterCore(root);
return diameter;
}
int diameterCore(TreeNode* root){
if(root == NULL)
return ;
int left = diameterCore(root->left);
int right = diameterCore(root->right);
diameter = max(diameter,left + right);
return left > right ? left + : right + ;
}
int diameter = ;
};

因为两个题很相似,所以也可以写成124题这样的形式:

class Solution {
public:
int diameterOfBinaryTree(TreeNode* root) {
int res = ;
diameterOfBinaryTree(root,res);
return res;
}
int diameterOfBinaryTree(TreeNode* root,int& res){
if(root == NULL)
return ;
int left = diameterOfBinaryTree(root->left,res);
int right = diameterOfBinaryTree(root->right,res);
res = max(left + right,res);
return max(left,right) + ;
}
};

leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)的更多相关文章

  1. 第四周 Leetcode 124. Binary Tree Maximum Path Sum (HARD)

    124. Binary Tree Maximum Path Sum 题意:给定一个二叉树,每个节点有一个权值,寻找任意一个路径,使得权值和最大,只需返回权值和. 思路:对于每一个节点 首先考虑以这个节 ...

  2. 【LeetCode】124. Binary Tree Maximum Path Sum

    Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and ...

  3. [leetcode]Binary Tree Maximum Path Sum

    Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and ...

  4. 【leetcode】Binary Tree Maximum Path Sum

    Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and ...

  5. LeetCode: Binary Tree Maximum Path Sum 解题报告

    Binary Tree Maximum Path SumGiven a binary tree, find the maximum path sum. The path may start and e ...

  6. 二叉树系列 - 二叉树里的最长路径 例 [LeetCode] Binary Tree Maximum Path Sum

    题目: Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start ...

  7. 26. Binary Tree Maximum Path Sum

    Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and ...

  8. [leetcode]124. Binary Tree Maximum Path Sum二叉树最大路径和

    Given a non-empty binary tree, find the maximum path sum. For this problem, a path is defined as any ...

  9. [LeetCode] 124. Binary Tree Maximum Path Sum 求二叉树的最大路径和

    Given a non-empty binary tree, find the maximum path sum. For this problem, a path is defined as any ...

随机推荐

  1. ECMAScript 引用类型

    Object对象 新建对象 var obj = new Object() var obj ={} var obj={age:23} ... hasOwnProperty(property) 方法 va ...

  2. 教你分分钟搞定Python之Flask框架

    用最短的时间开发一个数据操作接口,Python是王道! 一.安装pip .首先检查linux有没有安装python-pip包,终端执行 pip -V [root@ network-scripts]# ...

  3. JS如何判断一个对象是否为空、是否有某个属性

    一.js判断一个对象是否为空 方法一: let obj1 = {} let obj2 = {a:1} function empty(obj){ for (let key in obj){ return ...

  4. js之跑马灯广告

    目标效果:每过1秒重复把广告的第一个字符放到最后,达到动态跑马灯效果 代码如下: <!DOCTYPE html> <html lang="en"> < ...

  5. python之黏包和黏包解决方案

    黏包现象主要发生在TCP连接, 基于TCP的套接字客户端往服务端上传文件,发送时文件内容是按照一段一段的字节流发送的,在接收方看来,根本不知道该文件的字节流从何处开始,在何处结束. 两种黏包现象: 1 ...

  6. Windows 10修复

    [以管理员运行如下命令]: 1.sfc /scannow 命令将扫描所有受保护的系统文件,并用位于 %WinDir%\System32\dllcache 的压缩文件夹中的缓存副本替换损坏的文件. 2. ...

  7. 免费工资总额管控系统-JXHR2016

    •工资总额是指按照国家统计局规定的统计口径或企业规定,在一定时期内支付给各类用工的劳动报酬总额 •工资总额,即基本工资,包括岗位工资.各项津补贴 •JXHR2016以薪酬管控为核心,结合人力资源规划. ...

  8. IE和Chrome执行javascript对鼠标双击事件的不同响应

    最近在用天地图API帮同学做点开发的工作,主要是基于天地图的API实现违法用地举报的在线地图标绘,要实现的效果如下: 由于是基于天地图API的TPolygonTool工具实现面积量测和多边形绘制功能, ...

  9. Android View体系(三)属性动画

    上一篇文章讲了View滑动的六种方法,其中一种是使用动画,这篇文章我们来讲一讲动画的其中一种:属性动画. 1.android视图动画和属性动画 视图动画我们都了解,它提供了AlphaAnimation ...

  10. memcached分析

    memcache介绍 memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web应用以减轻数据库负担.它通过在内存中缓存数据和对象,来减少读取数据库的次数.从而提高动态.数据库驱动网站速度 ...