// 删除节点
Node* deleteNode(Node* root, int data) {
// 1. 执行普通的BST删除
if (root == NULL) return root;
if (data < root->data) {
root->left = deleteNode(root->left, data);
} else if (data > root->data) {
root->right = deleteNode(root->right, data);
} else {
// 找到要删除的节点
if (root->left == NULL || root->right == NULL) {
Node* temp = root->left ? root->left : root->right;
if (temp == NULL) {
temp = root;
root = NULL; // 该节点是叶子节点
} else {
*root = *temp; // 该节点有一个子节点
}
free(temp);
} else {
// 该节点有两个子节点
Node* temp = minNode(root->right); //找到右子树中的最小节点
root->data = temp->data; // 将最小节点的值赋值给root
root->right = deleteNode(root->right, temp->data); // 继续删除最小的节点
// 将右子树最小节点的值覆盖掉root的值,然后继续删除这个最小值的节点
}
}
// 如果树只有一个节点,则返回
if (root == NULL) return root;
// 2. 更新节点高度
updateHeight(root);
// 3. 检查不平衡状态并进行相应的旋转
int balance = getBalance(root);
// 左左情况
if (balance > 1 && getBalance(root->left) >= 0) {
return rightRotate(root);
}
// 右右情况
if (balance < -1 && getBalance(root->right) <= 0) {
return leftRotate(root);
}
// 左右情况
if (balance > 1 && getBalance(root->left) < 0) {
root->left = leftRotate(root->left);
return rightRotate(root);
}
// 右左情况
if (balance < -1 && getBalance(root->right) > 0) {
root->right = rightRotate(root->right);
return leftRotate(root);
}
return root; // 返回更新后的根节点
}