什么是二叉搜索
二叉搜索树(Binary Search Tree,简称BST)是一种数据结构,是一棵二叉树,其每个节点都具有以下性质:左子树中所有节点的值均小于其父节点的值;右子树中所有节点的值均大于其父节点的值。因此,它可以快速地找到一个节点或一组节点。在C++中,我们可以通过定义一个二叉搜索树类来实现这个数据结构。
代码
结点
首先,我们需要定义节点类。每个节点应该有两个指向左右子节点的指针和一个存储值的变量。
struct Node{
int val;
Node *left;
Node *right;
Node(int x): val(x), left(NULL), right(NULL){}
};
插入
接下来,我们可以定义一个BST类来实现插入、查找和删除操作。插入操作遵循BST的性质,即比当前节点的值小的插入到左子树,比当前节点的值大的插入到右子树。遇到空节点就插入。
class BST{
private:
Node *root;
public:
BST(): root(NULL){}
void insert(int val){
if(root == NULL){
root = new Node(val);
return;
}
Node *cur = root;
while(true){
if(val < cur->val){
if(cur->left == NULL){
cur->left = new Node(val);
break;
}
cur = cur->left;
}
else if(val > cur->val){
if(cur->right == NULL){
cur->right = new Node(val);
break;
}
cur = cur->right;
}
}
}
};
查找
查找操作也是按照BST的性质进行,在左子树中查找比当前节点小的值,在右子树中查找比当前节点大的值。如果查找到了,就返回该节点的指针。
Node* search(int val){
Node *cur = root;
while(cur != NULL){
if(val == cur->val){
return cur;
}
else if(val < cur->val){
cur = cur->left;
}
else if(val > cur->val){
cur = cur->right;
}
}
return NULL;
}
删除
删除操作需要考虑三种情况:当前节点没有子节点,当前节点只有一个子节点,当前节点有两个子节点。对于第一种情况,直接删除当前节点即可;对于第二种情况,将该节点的子节点链到父节点上,然后删除该节点;对于第三种情况,我们可以找到当前节点的后继节点(即右子树中比当前节点大的最小节点),将其值赋给当前节点,然后删除后继节点。
void delete(int val){
root = deleteNode(root, val);
}
Node* deleteNode(Node *root, int val){
if(root == NULL){
return NULL;
}
if(val < root->val){
root->left = deleteNode(root->left, val);
}
else if(val > root->val){
root->right = deleteNode(root->right, val);
}
else{
if(root->left == NULL){
return root->right;
}
else if(root->right == NULL){
return root->left;
}
else{
Node *temp = minNode(root->right);
root->val = temp->val;
root->right = deleteNode(root->right, temp->val);
}
}
return root;
}
Node* minNode(Node *tree){
while(tree->left != NULL){
tree = tree->left;
}
return tree;
}