输入一系列整数序列,建立二叉查找树,按照从小到大顺序输出序列, 例如输入整数序列:40,20,60,10,50,45,30,55,70,25,建立得到一个二叉查找树, 按照中序遍历打印输出数据,输入一个数,如果该数不存在则插入,输入一个数, 如果存在,则删除它C语言
时间: 2024-12-20 18:20:11 浏览: 12
白色大气风格的商务团队公司模板下载.zip
在C语言中,我们可以创建一个二叉搜索树(Binary Search Tree,BST)结构并实现插入、删除和中序遍历的功能。首先,我们需要定义一个节点结构:
```c
typedef struct TreeNode {
int val; // 节点值
struct TreeNode* left; // 左子树指针
struct TreeNode* right; // 右子树指针
} TreeNode;
```
接下来,我们可以创建函数分别实现上述操作:
1. 插入函数 (`insert`):
```c
TreeNode* insert(TreeNode* root, int val) {
if (!root) return (TreeNode*)malloc(sizeof(TreeNode));
if (val < root->val)
root->left = insert(root->left, val);
else if (val > root->val)
root->right = insert(root->right, val);
else
return root; // 避免重复插入相同的值
return root;
}
```
2. 删除函数 (`delete`):
```c
TreeNode* deleteNode(TreeNode* root, int val) {
if (!root) return root;
if (val < root->val)
root->left = deleteNode(root->left, val);
else if (val > root->val)
root->right = deleteNode(root->right, val);
else {
if (!root->left && !root->right) { // 空节点直接删除
free(root);
root = NULL;
} else if (!root->left) { // 只有右子树
TreeNode* temp = root;
root = root->right;
free(temp);
} else if (!root->right) { // 只有左子树
TreeNode* temp = root;
root = root->left;
free(temp);
} else { // 有两个孩子
TreeNode* temp = findMin(root->right); // 找最小的右子节点
root->val = temp->val;
root->right = deleteNode(root->right, temp->val);
}
}
return root;
}
TreeNode* findMin(TreeNode* node) {
while (node->left) {
node = node->left;
}
return node;
}
```
3. 中序遍历并打印函数 (`inOrderTraversal`):
```c
void inOrderTraversal(TreeNode* root) {
if (root != NULL) {
inOrderTraversal(root->left);
printf("%d ", root->val); // 输出节点值
inOrderTraversal(root->right);
}
}
```
最后,用户可以按需调用这些函数,插入数字、删除数字并打印结果。例如:
```c
int main() {
TreeNode* root = NULL;
// 初始化根节点为空
// ...
int input;
scanf("%d", &input);
while (input != -1) {
root = insert(root, input);
scanf("%d", &input);
}
inOrderTraversal(root);
// 用户请求删除某个节点,调用 deleteNode 函数
// ...
return 0;
}
```
阅读全文