软考
APP下载

二叉排序树的构造过程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,然后定义一个数组存放待插入的节点。在循环遍历数组时,通过插入操作将每个节点插入到树中。

备考资料 免费领取:软件设计师报考指南+考情分析+思维导图等 立即下载
真题演练 精准解析历年真题,助你高效备考! 立即做题
相关阅读
软件设计师题库