问题描述
笔记
这个题是没想出来,最后参考了九章算法的解法,是最高效的,把depth函数做一点修改,如果不平衡的情况下返回-1。(代码1)
代码2是剑指offer的重复遍历子节点的程序。理解简单,效率最低。
代码3是代码2的改进版,不需要重复遍历节点。“一边遍历,一边记录深度”。
代码1
/**
* 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) {
// write your code here
return depth(root) != -1;
}
int depth(TreeNode *root)
{
if (root == NULL)
return 0;
int left = depth(root->left);
int right = depth(root->right);
if (left == -1 || right == -1 || abs(left-right) > 1)
return -1;
return max(left, right) + 1;
}
};
/**
* 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.
*/
int depth(TreeNode *root)
{
if (root == NULL)
return 0;
return max(depth(root->left), depth(root->right)) + 1;
}
bool isBalanced(TreeNode *root) {
// write your code here
if (root == NULL)
return true;
if (!isBalanced(root->left))
return false;
if (!isBalanced(root->right))
return false;
int left = depth(root->left);
int right = depth(root->right);
if (abs(left-right) > 1)
return false;
return true;
}
};
代码3
/**
* 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 balance(TreeNode *root, int &depth)
{
if (root == NULL)
{
depth = 0;
return true;
}
int left, right;
if (balance(root->left, left) && balance(root->right, right))
{
if (abs(left - right) <= 1)
{
depth = max(left, right) + 1;
return true;
}
}
return false;
}
bool isBalanced(TreeNode *root) {
// write your code here
int depth = 0;
return balance(root, depth);
}
};