📅  最后修改于: 2023-12-03 15:12:37.705000             🧑  作者: Mango
本题要求实现一个算法,用于确定给定的二叉搜索树是否是平衡的。
二叉搜索树是满足以下条件的二叉树:
平衡二叉树是一棵满足以下条件的二叉树:
为了让问题更具体化,我们把平衡二叉树的高度定义为它的根节点到最远叶子节点的距离。叶子节点是没有子节点的节点。树的高度为 1。
现在,给定一个二叉搜索树,请你实现一个算法,用于确定该树是否是平衡二叉树。
函数的输入是一个二叉搜索树的指针,指向该树的根节点。
二叉搜索树的节点定义如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
函数需要返回一个布尔值,表示该二叉搜索树是否是平衡二叉树。
本题可以使用递归求解。
对于根节点,如果左子树和右子树的高度差不超过 1,那么它就是一棵平衡二叉树;否则,它不是一棵平衡二叉树。
为了求出左右子树的高度,我们可以递归地调用相同的函数。
class Solution {
public:
bool isBalanced(TreeNode* root) {
if (root == nullptr) return true; // 空树为平衡树
int left_height = getHeight(root->left); // 左子树高度
int right_height = getHeight(root->right); // 右子树高度
if (abs(left_height - right_height) > 1) return false; // 高度差超过 1 不平衡
return isBalanced(root->left) && isBalanced(root->right); // 否则递归判断左右子树是否为平衡树
}
private:
int getHeight(TreeNode* root) { // 求树的高度
if (root == nullptr) return 0;
return 1 + max(getHeight(root->left), getHeight(root->right));
}
};
时间复杂度为 $O(n\log{n})$,空间复杂度为 $O(n)$,其中 $n$ 是二叉搜索树的节点数。