leetcode 124. Binary Tree Maximum Path Sum 、543. Diameter of Binary Tree(直径)
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(直径)的更多相关文章
- 第四周 Leetcode 124. Binary Tree Maximum Path Sum (HARD)
124. Binary Tree Maximum Path Sum 题意:给定一个二叉树,每个节点有一个权值,寻找任意一个路径,使得权值和最大,只需返回权值和. 思路:对于每一个节点 首先考虑以这个节 ...
- 【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 ...
- [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 ...
- 【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 ...
- 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 ...
- 二叉树系列 - 二叉树里的最长路径 例 [LeetCode] Binary Tree Maximum Path Sum
题目: Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start ...
- 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 ...
- [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 ...
- [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 ...
随机推荐
- .NET实现发送邮件
注意:需要找到“POP3/SMTP服务”并开启,然后生成授权码,生成的授权码就是下面登入的密码. /// <summary> /// 发送邮件 /// </summary> / ...
- DataTable的一个简单的扩展
我们在调试代码的时候经常遇到DataTable的数据类型错误,这个类可以帮助我们很快查看DataTable的结构信息. /// <summary> /// DataTable扩展类 /// ...
- cocoapods使用-库托管到svn或者github
下拉svn库(自定义库或者第三方库)到工程中: 1. 若未安装,请安装cocoapods: http://www.cnblogs.com/sunjianfei/p/6089231.html ...
- JDK源码解析之Java SPI机制
1. spi 是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件. 系统设计的各个抽象,往往 ...
- Mybatis generator代码生成
背景 项目中使用Mybatis做持久层框架,但由于开发成员水平不一,写dao的时候,各有各的偏好,有时候还会写出带sql注入漏洞的代码. 出现sql注入漏洞,一般是#和$的区别没弄明白: $ 直接把字 ...
- springboot整合freemarker----一点小小的错误
最近小弟正在学习springboot,没办法,现在微服务太火了.小弟也要顺应时代的潮流啊 :( 好了,废话不多说了!!!! 首先在springboot的pom.xml添加freemarker的依赖 & ...
- Django Rest Framework之权限
基本代码结构 url.py: from django.conf.urls import url, include from app import views urlpatterns = [ url(r ...
- 大型Vuex应用程序的目录结构
译者按: 听前端大佬聊聊Vuex大型项目架构的经验 原文: Large-scale Vuex application structures 译者: Fundebug 为了保证可读性,本文采用意译而非直 ...
- Kotlin入门(2)让App开发变得更容易
上一篇文章介绍了如何搭建Kotlin的开发环境,可是这个开发环境依然基于Android Studio,而在Android Studio上使用Java进行编码,本来就是理所应当的,何必还要专门弄个Kot ...
- (网页)AngularJS中【Error: [$rootScope:inprog]】的解决办法(转)
转自CSDN: Error: [$rootScope:inprog] http://errors.angularjs.org/1.5.8/$rootScope/inprog?p0=%24apply 如 ...