二叉排序树(BST)详解
1. 定义
二叉排序树(Binary Search Tree,简称BST)是一种二叉树,其中每个节点包含一个关键字,并满足以下性质:
- 对于每个节点,其左子树中所有节点的关键字都小于该节点的关键字。
- 对于每个节点,其右子树中所有节点的关键字都大于该节点的关键字。
- 左子树和右子树都是二叉排序树。
2. 各种操作
插入操作
将一个新的关键字插入到BST中。插入时,通过比较关键字大小,决定插入位置。具体步骤如下:
- 从根节点开始,比较新插入关键字和当前节点关键字的大小。
- 如果新关键字小于当前节点关键字,则移至左子树;反之,则移至右子树。
- 重复上述步骤,直到找到一个空位置,将新关键字插入该位置。
插入操作的代码实现如下:
// 插入节点
Node* insert(Node* node, int key) {
if (node == NULL) return createNode(key);
if (key < node->key) {
node->left = insert(node->left, key);
} else if (key > node->key) {
node->right = insert(node->right, key);
}
return node;
}
搜索操作
在BST中查找一个关键字,步骤如下:
- 从根节点开始,比较目标关键字和当前节点关键字的大小。
- 如果目标关键字等于当前节点关键字,则查找成功。
- 如果目标关键字小于当前节点关键字,则移至左子树;反之,则移至右子树。
- 重复上述步骤,直到找到目标关键字或遇到空节点(查找失败)。
搜索操作的代码实现如下:
// 搜索节点
Node* search(Node* root, int key) {
if (root == NULL || root->key == key) {
return root;
}
if (key < root->key) {
return search(root->left, key);
} else {
return search(root->right, key);
}
}
删除操作
删除BST中的一个节点,分三种情况:
- 叶子节点:直接删除该节点。
- 仅有一个子节点:用其唯一的子节点替代该节点。
- 有两个子节点:找到该节点的后继(右子树中最小的节点),用后继节点替代该节点,然后删除后继节点。
删除操作的代码实现如下:
// 找到最小值节点
Node* minValueNode(Node* node) {
Node* current = node;
while (current && current->left != NULL) {
current = current->left;
}
return current;
}
// 删除节点
Node* deleteNode(Node* root, int key) {
if (root == NULL) return root;
if (key < root->key) {
root->left = deleteNode(root->left, key);
} else if (key > root->key) {
root->right = deleteNode(root->right, key);
} else {
if (root->left == NULL) {
Node* temp = root->right;
free(root);
return temp;
} else if (root->right == NULL) {
Node* temp = root->left;
free(root);
return temp;
}
Node* temp = minValueNode(root->right);
root->key = temp->key;
root->right = deleteNode(root->right, temp->key);
}
return root;
}