二叉排序树的构造过程c代码
二叉排序树是一种非常常见的数据结构,它和二叉树很相似,但是它满足二叉树的左子树节点小于父节点,右子树节点大于父节点的关系。在实际应用中,二叉排序树有着广泛的应用,例如快速查找、排序和去重等操作。本篇文章将从多个角度分析二叉排序树的构造过程c代码。
1、二叉排序树的插入操作
在构造二叉排序树的过程中,插入操作是至关重要的,其代码如下所示:
```c
//定义二叉排序树节点
typedef struct {
int key;//键值
struct BSTNode *left; //左节点
struct BSTNode *right; //右节点
} BSTNode;
//插入操作
BSTNode* insertBST(BSTNode *root, int key) {
//1、如果根节点为空,则直接将key插入到根节点
if(root == NULL) {
root = (BSTNode*)malloc(sizeof(BSTNode));
root->key = key;
root->left = NULL;
root->right = NULL;
return root;
}
//2、如果插入的值小于根节点,则递归插入到左子树
if(key < root->key) {
root->left = insertBST(root->left, key);
}
//3、如果插入的值大于根节点,则递归插入到右子树
else if(key > root->key) {
root->right = insertBST(root->right, key);
}
//4、如果插入的值等于根节点,则不做处理
return root;
}
```
代码中,首先判定根节点是否为空,如果是,则直接将key值插入到根节点。如果不是,则比较插入的key值与根节点的key值大小关系,并按大小关系递归插入到左子树或右子树。如果插入的key与根节点相等,则不做任何处理。
2、二叉排序树的查找操作
在插入新元素时,我们也需要查找是否存在相同的元素。二叉排序树的查找操作代码如下所示:
```c
//查找操作
BSTNode* findBST(BSTNode *root, int key) {
if(root == NULL) { //根节点为空,返回NULL
return NULL;
} else if(key == root->key) { //根节点等于要查找的节点,返回根节点
return root;
} else if(key < root->key) { //要查找的节点小于根节点,递归查找左子树
return findBST(root->left, key);
} else { //要查找的节点大于根节点,递归查找右子树
return findBST(root->right, key);
}
}
```
代码中,首先判断根节点是否为空,如果为空,则返回NULL。然后比较要查找的key值与根节点的key值大小关系,并按关系递归查找左子树或右子树。如果要查找的key值等于根节点的key值,则返回根节点。
3、二叉排序树的删除操作
如果要从二叉排序树中删除某个节点,需要分以下三种情况进行处理:该节点为叶子节点、该节点只有一个子节点、该节点有两个子节点,具体代码如下:
```c
//查找最小值
BSTNode* findMin(BSTNode *root) {
while(root->left != NULL) {
root = root->left;
}
return root;
}
//删除操作
BSTNode* deleteBST(BSTNode *root, int key) {
if(root == NULL) { //根节点为空
return NULL;
}
if(key < root->key) { //key值小于根节点的key值
root->left = deleteBST(root->left, key);
} else if(key > root->key) { //key值大于根节点的key值
root->right = deleteBST(root->right, key);
} else {
if(root->left == NULL && root->right == NULL) { //情况1
free(root);
root = NULL;
} else if(root->left == NULL) { //情况2:只有右子树
BSTNode *temp = root;
root = root->right;
free(temp);
} else if(root->right == NULL) { //情况2:只有左子树
BSTNode *temp = root;
root = root->left;
free(temp);
} else { //情况3:左右子树都存在
BSTNode *temp = findMin(root->right);
root->key = temp->key;
root->right = deleteBST(root->right, temp->key);
}
}
return root;
}
```
代码中,首先查找根节点是否为空,判断key值与当前节点的key值大小关系并递归搜索到待删除的节点。当找到待删除的节点时,考虑以下三种情况:
- 情况1:该节点为叶子节点,直接删除该节点;
- 情况2:该节点只有一个子节点,将子节点作为根节点;
- 情况3:该节点有两个子节点,找到右子树的最小值节点,将最小值节点的值赋给当前节点,再递归删除右子树的最小值节点。
4、二叉排序树的构造过程
在构造二叉排序树时,可以通过以下方式进行构造:
```c
int main() {
BSTNode *root = NULL;
int arr[] = {5, 3, 6, 8, 4, 2, 7, 1, 9};
int len = sizeof(arr) / sizeof(arr[0]);
for(int i=0; i
root = insertBST(root, arr[i]);
}
return 0;
}
```
代码中,首先定义根节点为NULL,然后定义一个数组存放待插入的节点。在循环遍历数组时,通过插入操作将每个节点插入到树中。