解释下列代码: Node* findMin(Node* root) { while (root->left != NULL) { root = root->left; } return root; } Node* searchRecursive(Node* root, int value) { if (root == NULL || root->data == value) { return root; } if (value < root->data) { return searchRecursive(root->left, value); } else { return searchRecursive(root->right, value); } } void inorderTraversal(Node* root) { if (root == NULL) { return; } inorderTraversal(root->left); cout << root->data << " "; inorderTraversal(root->right); }
时间: 2024-02-15 10:27:04 浏览: 21
这段代码是二叉搜索树相关的三个函数,具体解释如下:
- Node* findMin(Node* root) :函数名为 findMin,参数为指向二叉搜索树的根节点的指针 root。函数的作用是在二叉搜索树中查找并返回最小的节点。这个函数的实现是通过不断遍历当前节点的左子树,直到找到最左端的节点,即为最小节点。
- Node* searchRecursive(Node* root, int value) :函数名为 searchRecursive,参数包括一个指向二叉搜索树的根节点的指针 root,以及需要查找的节点值 value。函数返回一个指向找到的节点的指针,如果没有找到则返回 NULL。这个函数的实现是通过递归查找二叉搜索树的左子树或右子树,直到找到等于 value 的节点或者当前节点为空。
- void inorderTraversal(Node* root) :函数名为 inorderTraversal,参数为指向二叉搜索树的根节点的指针 root。函数的作用是按照中序遍历的顺序输出二叉搜索树中的所有节点值。具体实现是先递归遍历左子树,再输出当前节点的值,最后递归遍历右子树。
这三个函数是二叉搜索树基本操作中比较常用的函数,分别用于查找最小节点、递归查找节点和中序遍历节点。
相关问题
C语言程序设计一个选择式菜单,一级菜单形式如下: 查找子系统,其中二叉排序树包括程序编写在二叉排序树上的查找、插入、删除结点的程序;编写使二叉排序树中序输出的程序; **************************************** * 1------顺 序 查 找 * * 2------二 分 查 找 * * 3------二 叉 排 序 树 * * 0------返 回 * **************************************** 请选择菜单号(0--3):
好的,这是一个比较简单的选择式菜单的 C 语言程序设计。下面是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int data;
struct node* left;
struct node* right;
} Node;
void createBST(Node** root, int data) {
if (*root == NULL) {
*root = (Node*)malloc(sizeof(Node));
(*root)->data = data;
(*root)->left = (*root)->right = NULL;
return;
}
if (data <= (*root)->data) {
createBST(&((*root)->left), data);
} else {
createBST(&((*root)->right), data);
}
}
Node* searchBST(Node* root, int data) {
if (root == NULL || root->data == data) {
return root;
}
if (data < root->data) {
return searchBST(root->left, data);
} else {
return searchBST(root->right, data);
}
}
Node* findMin(Node* node) {
if (node == NULL) {
return NULL;
}
if (node->left == NULL) {
return node;
} else {
return findMin(node->left);
}
}
Node* deleteNode(Node* root, int data) {
if (root == NULL) {
return NULL;
}
if (data < root->data) {
root->left = deleteNode(root->left, data);
} else if (data > root->data) {
root->right = deleteNode(root->right, data);
} else {
if (root->left == NULL && root->right == NULL) {
free(root);
root = NULL;
} else if (root->left == NULL) {
Node* temp = root;
root = root->right;
free(temp);
} else if (root->right == NULL) {
Node* temp = root;
root = root->left;
free(temp);
} else {
Node* temp = findMin(root->right);
root->data = temp->data;
root->right = deleteNode(root->right, temp->data);
}
}
return root;
}
void inorder(Node* root) {
if (root != NULL) {
inorder(root->left);
printf("%d ", root->data);
inorder(root->right);
}
}
int main() {
Node* root = NULL;
int choice, data;
while (1) {
printf("****************************************\n");
printf("* 1------顺 序 查 找 *\n");
printf("* 2------二 分 查 找 *\n");
printf("* 3------二 叉 排 序 树 *\n");
printf("* 0------返 回 *\n");
printf("****************************************\n");
printf("请选择菜单号(0--3):");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要查找的数:");
scanf("%d", &data);
if (searchBST(root, data) != NULL) {
printf("找到了!\n");
} else {
printf("没找到!\n");
}
break;
case 2:
printf("请输入要查找的数:");
scanf("%d", &data);
// 具体的二分查找实现这里省略
break;
case 3:
printf("请输入要插入的数(以-1结束):");
while (1) {
scanf("%d", &data);
if (data == -1) {
break;
}
createBST(&root, data);
}
printf("插入完成!\n");
printf("中序输出:");
inorder(root);
printf("\n");
printf("请输入要删除的数:");
scanf("%d", &data);
root = deleteNode(root, data);
printf("删除完成!\n");
printf("中序输出:");
inorder(root);
printf("\n");
break;
case 0:
printf("谢谢使用!\n");
exit(0);
default:
printf("输入错误,请重新输入!\n");
break;
}
}
return 0;
}
```
注意:二分查找的具体实现没有在代码中给出,可以自行实现。
树状结构表的增删改查用代码怎么写
对于树状结构表的增删改查,可以使用递归算法来实现。以下是示例代码:
1. 增加节点:
void addNode(TreeNode* root, TreeNode* newNode) {
if (root == NULL) {
root = newNode;
return;
}
if (newNode->val < root->val) {
addNode(root->left, newNode);
} else {
addNode(root->right, newNode);
}
}
2. 删除节点:
TreeNode* deleteNode(TreeNode* root, int val) {
if (root == NULL) {
return NULL;
}
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 == NULL) {
TreeNode* temp = root->right;
delete root;
return temp;
} else if (root->right == NULL) {
TreeNode* temp = root->left;
delete root;
return temp;
} else {
TreeNode* temp = findMin(root->right);
root->val = temp->val;
root->right = deleteNode(root->right, temp->val);
}
}
return root;
}
TreeNode* findMin(TreeNode* root) {
while (root->left != NULL) {
root = root->left;
}
return root;
}
3. 修改节点:
void modifyNode(TreeNode* root, int oldVal, int newVal) {
TreeNode* node = searchNode(root, oldVal);
if (node != NULL) {
node->val = newVal;
}
}
4. 查找节点:
TreeNode* searchNode(TreeNode* root, int val) {
if (root == NULL || root->val == val) {
return root;
}
if (val < root->val) {
return searchNode(root->left, val);
} else {
return searchNode(root->right, val);
}
}
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.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)
![](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)