分治,递归。
这道题有两种好方法。
- 方法1:先有一个求深度depth的函数,然后递归比较各个节点的depth之差,返回结果。
C++代码:
class Solution {
public:
/**
* @param root: The root of binary tree.
* @return: An integer
*/
int maxPathSum(TreeNode *root) {
// write your code here
int ret = INT_MIN;
onePath(root,ret);
return ret;
}
int onePath(TreeNode* root,int&ret)
{
if(root==nullptr)
return 0;
int l = onePath(root->left,ret);
int r = onePath(root->right,ret);
ret = max(ret,max(0,l)+max(0,r)+root->val);
return max(0,max(l,r))+root->val;
}
};
- 方法2:深度优先搜索根节点,遇到不合格的节点,及时反馈,这样可以迅速得出结果,时间复杂度小。
C++ 代码:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param root: The root of binary tree.
* @return: True if this Binary tree is Balanced, or false.
*/
bool isBalanced(TreeNode *root) {
if (root == NULL) {
return true;
}
if (dfs(root)>0) {
return true;
}
return false;
}
int dfs(TreeNode * root) {
if (root==NULL) {
return 0;
}
int left = dfs(root->left);
int right = dfs(root->right);
if (left<0 || right<0 || abs(left-right)>1) {
return -1;
}
return max(left,right) + 1;
}
};