C语言编程实现读入一串字符创建一棵二叉排序树,然后分别实现:二叉排序树的查找;二叉排序树的插入;二叉排序树的删除等操作
时间: 2023-08-21 13:09:35 浏览: 138
以下是C语言实现二叉排序树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 二叉排序树的查找
TreeNode* searchBST(TreeNode* root, int val) {
if (!root || root->val == val) {
return root;
}
if (val < root->val) {
return searchBST(root->left, val);
} else {
return searchBST(root->right, val);
}
}
// 二叉排序树的插入
TreeNode* insertBST(TreeNode* root, int val) {
if (!root) {
TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
if (val < root->val) {
root->left = insertBST(root->left, val);
} else {
root->right = insertBST(root->right, val);
}
return root;
}
// 二叉排序树的删除
TreeNode* deleteBST(TreeNode* root, int val) {
if (!root) {
return root;
}
if (val < root->val) {
root->left = deleteBST(root->left, val);
} else if (val > root->val) {
root->right = deleteBST(root->right, val);
} else {
if (!root->left) {
return root->right;
} else if (!root->right) {
return root->left;
} else {
TreeNode* node = root->right;
while (node->left) {
node = node->left;
}
root->val = node->val;
root->right = deleteBST(root->right, node->val);
}
}
return root;
}
// 二叉树的中序遍历
void inorderTraversal(TreeNode* root) {
if (!root) {
return;
}
inorderTraversal(root->left);
printf("%d ", root->val);
inorderTraversal(root->right);
}
int main() {
// 创建一棵二叉排序树
TreeNode* root = NULL;
char input[100];
printf("请输入一串数字,用空格分隔:");
fgets(input, 100, stdin);
char* p = input;
while (*p) {
int val = strtol(p, &p, 10);
root = insertBST(root, val);
}
// 输出二叉排序树中序遍历结果
printf("二叉排序树中序遍历结果:\n");
inorderTraversal(root);
// 测试二叉排序树的查找、插入、删除
int searchVal = 4;
TreeNode* searchNode = searchBST(root, searchVal);
printf("\n查找 %d 结果:", searchVal);
if (searchNode) {
printf("找到了,节点值为 %d\n", searchNode->val);
} else {
printf("没找到\n");
}
int insertVal = 10;
root = insertBST(root, insertVal);
printf("插入 %d 后的中序遍历结果:\n", insertVal);
inorderTraversal(root);
int deleteVal = 6;
root = deleteBST(root, deleteVal);
printf("\n删除 %d 后的中序遍历结果:\n", deleteVal);
inorderTraversal(root);
return 0;
}
```
代码思路:
1. 定义二叉树结构体 `TreeNode`,包含节点值 `val` 和左右子节点指针 `left` 和 `right`;
2. 实现二叉排序树的查找函数 `searchBST`,通过递归查找节点值为 `val` 的节点;
3. 实现二叉排序树的插入函数 `insertBST`,通过递归将节点值为 `val` 的节点插入到二叉排序树中;
4. 实现二叉排序树的删除函数 `deleteBST`,通过递归删除节点值为 `val` 的节点,并根据情况调整二叉排序树的结构;
5. 实现二叉树的中序遍历函数 `inorderTraversal`,通过递归输出二叉树的中序遍历结果;
6. 在 `main` 函数中读入一串数字,创建一棵二叉排序树,并输出中序遍历结果;
7. 在 `main` 函数中测试二叉排序树的查找、插入、删除操作,并输出中序遍历结果。
阅读全文