问题
给定⼀个⼆叉树,判断它是否是⾼度平衡的⼆叉树。本题中,⼀棵⾼度平衡 ⼆叉树定义为: ⼀个⼆叉树每个节点的左右两个⼦树的⾼度差的绝对值不超过 1。
示例 1:
示例2:
分析
题目要求判断给定的二叉树是否是高度平衡的二叉树。高度平衡的二叉树定义为每个节点左右两个子树的高度差的绝对值不超过1。
为了解决这个问题,我们可以使用递归的方法。首先,定义一个函数isBalanced,该函数接受一个二叉树的根节点,并返回一个布尔值表示该二叉树是否平衡。
在isBalanced函数内部,首先处理边界情况,如果根节点为空,则返回true,因为空树被认为是平衡的。
然后,通过调用另一个辅助函数getHeight来计算根节点的左右子树的高度。getHeight函数也是递归定义的,它接受一个节点作为参数,并返回以该节点为根的子树的高度。
在getHeight函数中,如果当前节点为空,则返回0。否则,递归计算左右子树的高度,并返回较大的高度加1,表示当前节点的高度。
回到isBalanced函数,我们在计算根节点的左右子树高度后,判断它们的高度差是否超过1。如果高度差大于1,则返回false,表示不平衡。否则,递归调用isBalanced函数判断左右子树是否平衡。
最后,在主函数中创建一个二叉树并调用isBalanced函数进行测试,根据返回结果输出相应的信息。
这样,我们就能通过递归地计算每个节点的高度并比较左右子树的高度差,来判断给定的二叉树是否是高度平衡的二叉树。
代码和运行结果
#include <iostream>
#include <cmath>
using namespace std;
// 定义二叉树节点
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
bool isBalanced(TreeNode* root) {
if (root == NULL) return true; // 空树是平衡的
int leftHeight = getHeight(root->left); // 左子树高度
int rightHeight = getHeight(root->right); // 右子树高度
if (abs(leftHeight - rightHeight) > 1) return false; // 高度差超过1,不平衡
return isBalanced(root->left) && isBalanced(root->right); // 递归判断左右子树是否平衡
}
private:
int getHeight(TreeNode* root) {
if (root == NULL) return 0;
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return max(leftHeight, rightHeight) + 1; // 返回当前节点的高度
}
};
// 测试
int main() {
TreeNode* root = new TreeNode(3);
root->left = new TreeNode(9);
root->right = new TreeNode(20);
root->right->left = new TreeNode(15);
root->right->right = new TreeNode(7);
// root->right->left->left = new TreeNode(8);
// root->right->right->right = new TreeNode(9);
Solution s;
if (s.isBalanced(root))
cout << "The binary tree is balanced." << endl;
else
cout << "The binary tree is not balanced." << endl;
return 0;
}
首先,根据题目的意思,我们需要判断的是其左右子树的高度差是否大于1。首先我们需要构造出一个二叉树,本代码以例1为例,构造了一棵二叉树,判断其左右子树是否高度差大于1,其实就是通过递归搜索其左右子树的高度,只要左右子树不为空,就让高度加1,然后返回左右子树的值,最后比较左右子树的高度就可以了。
在上面的代码中,isBalanced()函数用于判断给定的二叉树是否平衡,getHeight()函数用于计算二叉树的高度。在isBalanced()函数中,先判断当前节点左右子树的高度差是否超过1,如果是则返回false,否则递归判断左右子树是否平衡。