二叉排序树的定义,创建,查找和删除过程及其算法运算
时间: 2024-02-26 07:57:20 浏览: 146
二叉排序树(Binary Search Tree,BST)又称为二叉搜索树,是一种特殊的二叉树,它满足以下条件:
1. 左子树上所有节点的值均小于它的根节点的值;
2. 右子树上所有节点的值均大于它的根节点的值;
3. 左右子树也都是二叉排序树。
创建二叉排序树:
对于一个空树,直接将新节点插入作为根节点即可。对于非空树,从根节点开始,比较要插入的节点值与当前节点值的大小关系,如果比当前节点值小,则向左子树递归插入;如果比当前节点值大,则向右子树递归插入。
查找二叉排序树:
从根节点开始,如果要查找的节点值等于当前节点值,则返回当前节点;如果要查找的节点值小于当前节点值,则向左子树递归查找;如果要查找的节点值大于当前节点值,则向右子树递归查找。如果最后找不到该节点,则返回空。
删除二叉排序树:
删除节点分为三种情况:
1. 要删除的节点没有子节点,直接删除即可;
2. 要删除的节点只有一个子节点,将其子节点替换为该节点;
3. 要删除的节点有两个子节点,需要找到该节点的中序遍历的后继节点(即右子树中最小的节点),将其值赋给要删除的节点,然后删除该后继节点。
以下是二叉排序树的算法实现:
```
// 定义二叉排序树节点结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 创建二叉排序树
void insert(TreeNode* &root, int val) {
if (root == NULL) {
root = new TreeNode(val);
return;
}
if (val < root->val) {
insert(root->left, val);
} else {
insert(root->right, val);
}
}
// 查找二叉排序树
TreeNode* search(TreeNode* root, int val) {
if (root == NULL || root->val == val) {
return root;
}
if (val < root->val) {
return search(root->left, val);
} else {
return search(root->right, val);
}
}
// 删除二叉排序树
void remove(TreeNode* &root, int val) {
if (root == NULL) {
return;
}
if (val < root->val) {
remove(root->left, val);
} else if (val > root->val) {
remove(root->right, val);
} else {
if (root->left == NULL) {
TreeNode* temp = root->right;
delete root;
root = temp;
} else if (root->right == NULL) {
TreeNode* temp = root->left;
delete root;
root = temp;
} else {
TreeNode* temp = root->right;
while (temp->left != NULL) {
temp = temp->left;
}
root->val = temp->val;
remove(root->right, temp->val);
}
}
}
```
阅读全文