一:题目
输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
样例解释:
二:实现:
解题思路:
- 使用递归来遍历每个节点,计算左右子树的高度。
- 如果左右子树的高度差超过 1,直接返回 false。
- 如果某一子树不是平衡的,直接返回 false。
- 同时递归地返回当前子树的高度。
#include <iostream>
#include <algorithm>
#include <functional>
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
bool isBalanced(TreeNode* root)
{
std::function<int(TreeNode*)> height = [&](TreeNode* node) -> int {
if (node == nullptr)
{
return 0;
}
int leftHeight = height(node->left);
if (leftHeight == -1) return -1;
int rightHeight = height(node->right);
if (rightHeight == -1) return -1;
if (std::abs(leftHeight - rightHeight) > 1)
{
return -1;
}
return std::max(leftHeight, rightHeight) + 1;
};
return height(root) != -1;
}
int main()
{
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
//root->left->left->left = new TreeNode(6);
// 判断树是否平衡
if (isBalanced(root)) {
std::cout << "The tree is balanced." << std::endl;
}
else {
std::cout << "The tree is not balanced." << std::endl;
}
}