📜  门| GATE CS 2021 |设置 1 |问题 27(1)

📅  最后修改于: 2023-12-03 15:12:37.705000             🧑  作者: Mango

门 | GATE CS 2021 | 设置 1 | 问题 27

本题要求实现一个算法,用于确定给定的二叉搜索树是否是平衡的。

说明

二叉搜索树是满足以下条件的二叉树:

  • 每个节点都有一个唯一的键值。
  • 左子树上的所有节点的键值都小于该节点的键值。
  • 右子树上的所有节点的键值都大于该节点的键值。
  • 左子树和右子树都是二叉搜索树。

平衡二叉树是一棵满足以下条件的二叉树:

  • 左子树和右子树的高度最多相差 1。
  • 左子树和右子树都是平衡二叉树。

为了让问题更具体化,我们把平衡二叉树的高度定义为它的根节点到最远叶子节点的距离。叶子节点是没有子节点的节点。树的高度为 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$ 是二叉搜索树的节点数。