1、题目描述
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/
9 20
/
15 7
返回 true 。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/
2 2
/
3 3
/
4 4
返回 false 。
2、VS2019上运行
方法一:自顶向下的递归
#include <iostream>
#include <algorithm> // 包含用于 max() 函数的头文件
#include <cmath> // 包含用于 abs() 函数的头文件
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
// 计算二叉树的高度
int height(TreeNode* root) {
if (root == NULL) {
return 0;
}
else {
// 递归调用计算左子树和右子树的高度,并返回较大值加上当前节点的高度
return std::max(height(root->left), height(root->right)) + 1;
}
}
// 判断二叉树是否平衡
bool isBalanced(TreeNode* root) {
if (root == NULL) {
return true;
}
else {
// 判断左子树和右子树的高度差是否小于等于 1,以及递归判断左子树和右子树是否平衡
return std::abs(height(root->left) - height(root->right)) <= 1
&& isBalanced(root->left) && isBalanced(root->right);//abs是绝对值函数
}
}
};
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->right->left = new TreeNode(6);
root->right->right = new TreeNode(7);
// 创建 Solution 类的实例
Solution solution;
// 判断二叉树是否平衡,并输出结果
bool balanced = solution.isBalanced(root);
std::cout << "Is the binary tree balanced? " << (balanced ? "Yes" : "No") << std::endl;
// 释放二叉树的内存
delete root->left->left;
delete root->left->right;
delete root->right->left;
delete root->right->right;
delete root->left;
delete root->right;
delete root;
return 0;
}
Is the binary tree balanced? Yes
3、解题思路
- 首先,定义了一个 TreeNode 结构体,表示二叉树的节点,包含节点值以及左右子节点的指针。
- 然后,Solution 类的 height 方法用于计算二叉树的高度。通过递归调用,分别计算左子树和右子树的高度,并返回较大值加上当前节点的高度。当节点为空时,返回高度为 0。
- 接下来,Solution 类的 isBalanced 方法用于判断二叉树是否平衡。在该方法中,首先判断根节点是否为空,若为空则说明是一棵空树,返回 true。
- 若根节点不为空,通过调用 height 方法计算左子树和右子树的高度差,并使用 std::abs 函数计算绝对值。若高度差大于 1,说明当前节点的子树不平衡,返回 false。否则,递归判断左子树和右子树是否平衡,若都平衡则返回 true,否则返回 false。
- 在 main 函数中,创建一棵二叉树,并通过 Solution 类的实例调用 isBalanced 方法判断二叉树是否平衡。最后输出判断结果。
4、补充
- 对于判断二叉树是否平衡,除了需要比较左右子树高度差是否小于等于 1 外,还需要递归地判断左右子树是否平衡,因为一个平衡的二叉树定义是指所有节点的左右子树高度差都小于等于 1,且左右子树本身也是平衡的。