问题描述
笔记
这个题是没想出来,最后参考了九章算法的解法,是最高效的,把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);
}
};