C编程,把二叉排序树的检索函数的递归算法改写为非递归算法,并在主函数中调用它
时间: 2023-11-27 15:51:42 浏览: 75
二叉排序树的非递归检索算法可以使用循环实现,具体步骤如下:
1. 定义一个指针p指向根节点,将待查找的值key与p指向节点的值进行比较。
2. 如果key等于p指向节点的值,则返回p指向的节点。
3. 如果key小于p指向节点的值,则将p指向左子树继续查找。
4. 如果key大于p指向节点的值,则将p指向右子树继续查找。
5. 如果p为空,则说明没有找到对应的节点,返回NULL。
以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建节点
TreeNode* createNode(int val) {
TreeNode* node = (TreeNode*) malloc(sizeof(TreeNode));
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 插入节点
void insertNode(TreeNode** root, int val) {
if (*root == NULL) {
*root = createNode(val);
return;
}
if (val < (*root)->val) {
insertNode(&((*root)->left), val);
} else {
insertNode(&((*root)->right), val);
}
}
// 非递归查找节点
TreeNode* searchNode(TreeNode* root, int key) {
TreeNode* p = root;
while (p != NULL) {
if (key == p->val) {
return p;
} else if (key < p->val) {
p = p->left;
} else {
p = p->right;
}
}
return NULL;
}
// 测试代码
int main() {
TreeNode* root = NULL;
int arr[] = {5, 2, 7, 1, 3, 6, 8};
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i < len; i++) {
insertNode(&root, arr[i]);
}
TreeNode* node = searchNode(root, 3);
if (node != NULL) {
printf("找到了节点,值为%d\n", node->val);
} else {
printf("没有找到节点\n");
}
return 0;
}
```
在主函数中,我们先创建了一个二叉排序树,并插入了一些节点。然后调用非递归查找函数searchNode,在控制台输出查找结果。
阅读全文