二叉查找树的基本操作
时间: 2023-09-10 10:14:06 浏览: 53
二叉查找树(Binary Search Tree,BST)是一种常用的数据结构,它具有以下特性:
1. 左子树上的所有节点的值小于根节点的值。
2. 右子树上的所有节点的值大于根节点的值。
3. 左右子树也必须分别满足上述两个条件。
基本操作包括插入、删除和查找节点。
1. 插入操作:从根节点开始,比较要插入的节点值与当前节点值的大小关系,若小于当前节点值,则继续在左子树中插入;若大于当前节点值,则继续在右子树中插入。直到找到一个空的位置,将新节点插入其中。
2. 删除操作:首先需要找到要删除的节点。若要删除的节点为叶子节点(没有左右子节点),直接将其删除。若要删除的节点只有一个子节点,将其子节点替代要删除的节点即可。若要删除的节点有两个子节点,则需要找到其右子树中的最小节点或左子树中的最大节点来替代要删除的节点,然后删除这个替代节点。
3. 查找操作:从根节点开始,比较要查找的节点值与当前节点值的大小关系。若等于当前节点值,则找到了目标节点;若小于当前节点值,则继续在左子树中查找;若大于当前节点值,则继续在右子树中查找。直到找到目标节点或遍历完整个树。
这些是二叉查找树的基本操作,它们可以实现对数据的快速插入、删除和查找。
相关问题
二叉查找树的基本操作C语言
二叉查找树的基本操作包括插入、删除、查找、遍历等。
以下是基本操作的C语言实现:
1. 插入操作:
```c
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
void insert(TreeNode **root, int val) {
if (*root == NULL) {
*root = (TreeNode *)malloc(sizeof(TreeNode));
(*root)->val = val;
(*root)->left = NULL;
(*root)->right = NULL;
return;
}
if (val < (*root)->val) {
insert(&((*root)->left), val);
} else {
insert(&((*root)->right), val);
}
}
```
2. 删除操作:
```c
void delete(TreeNode **root, int val) {
if (*root == NULL) {
return;
}
if (val < (*root)->val) {
delete(&((*root)->left), val);
} else if (val > (*root)->val) {
delete(&((*root)->right), val);
} else {
if ((*root)->left == NULL) {
TreeNode *temp = *root;
*root = (*root)->right;
free(temp);
} else if ((*root)->right == NULL) {
TreeNode *temp = *root;
*root = (*root)->left;
free(temp);
} else {
TreeNode *temp = (*root)->right;
while (temp->left != NULL) {
temp = temp->left;
}
(*root)->val = temp->val;
delete(&((*root)->right), temp->val);
}
}
}
```
3. 查找操作:
```c
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);
}
}
```
4. 遍历操作:
```c
void inorderTraversal(TreeNode *root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
```
以上是二叉查找树的基本操作C语言实现,你可以根据需要修改代码。
二叉排序树基本操作的实现
二叉排序树也称为二叉搜索树,它是一种特殊的二叉树,满足以下性质:
1. 左子树中的所有节点的值均小于根节点的值;
2. 右子树中的所有节点的值均大于根节点的值;
3. 左子树和右子树也都是二叉排序树。
基本操作包括插入节点、删除节点和查找节点。下面是它们的实现:
1. 插入节点:
插入节点操作用于向二叉排序树中插入一个新节点。从根节点开始,比较插入节点的值与当前节点的值,如果小于当前节点的值,则进入左子树,否则进入右子树。直到找到一个空位置,将新节点插入到该位置。
示例代码如下:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def insert_node(root, val):
if root is None:
return TreeNode(val)
if val < root.val:
root.left = insert_node(root.left, val)
else:
root.right = insert_node(root.right, val)
return root
```
2. 删除节点:
删除节点操作用于从二叉排序树中删除指定节点。分为三种情况:
- 被删除节点没有子节点:直接删除即可;
- 被删除节点只有一个子节点:将子节点替代被删除节点的位置;
- 被删除节点有两个子节点:找到被删除节点的后继节点(右子树中最小的节点),将后继节点的值复制到被删除节点,然后删除后继节点。
示例代码如下:
```python
def find_min(node):
while node.left is not None:
node = node.left
return node
def delete_node(root, val):
if root is None:
return root
if val < root.val:
root.left = delete_node(root.left, val)
elif val > root.val:
root.right = delete_node(root.right, val)
else:
if root.left is None:
return root.right
elif root.right is None:
return root.left
else:
successor = find_min(root.right)
root.val = successor.val
root.right = delete_node(root.right, successor.val)
return root
```
3. 查找节点:
查找节点操作用于在二叉排序树中查找指定值的节点。从根节点开始,比较目标值与当前节点的值,如果小于当前节点的值,则进入左子树,否则进入右子树。如果找到匹配的节点,则返回该节点;如果遍历完整个树仍未找到匹配的节点,则返回空。
示例代码如下:
```python
def search_node(root, val):
if root is None or root.val == val:
return root
if val < root.val:
return search_node(root.left, val)
else:
return search_node(root.right, val)
```
以上是二叉排序树基本操作的实现。你可以根据需要调用这些函数来操作二叉排序树。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)