请用C语言编写代码需要写注释:二叉查找树:1 问题描述对于查找集合进行动态查找为了使得元素的插入、删除和查找操作都能够很快地完成可以采用二叉查找树作为查找结构。对于给定的查找集合给出在二叉查找树上进行查找的比较次数。输入有 N+2 个整数第一个整数N≤1000是元素个数 N接下来 N 个整数表示待查找集合最后一个整数表示待查值输出是一个整数表示查找进行的比较次数。2 基本要求1设计二叉查找树的存储
#include <stdio.h> #include <stdlib.h>
// 定义二叉查找树节点结构体 typedef struct TreeNode { int data; // 节点存储的数据 struct TreeNode* left; // 左子树指针 struct TreeNode* right; // 右子树指针 } TreeNode;
// 创建新节点 TreeNode* createNode(int value) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->data = value; newNode->left = NULL; newNode->right = NULL; return newNode; }
// 向二叉查找树插入节点 TreeNode* insertNode(TreeNode* root, int value) { if (root == NULL) { // 树为空,创建新节点作为根节点 return createNode(value); } if (value < root->data) { // 插入值小于当前节点值,插入到左子树 root->left = insertNode(root->left, value); } else if (value > root->data) { // 插入值大于当前节点值,插入到右子树 root->right = insertNode(root->right, value); } return root; }
// 在二叉查找树中查找节点,返回比较次数 int searchNode(TreeNode* root, int value, int count) { if (root == NULL) { // 查找失败 return count; } if (value == root->data) { // 查找成功 return count + 1; } if (value < root->data) { // 查找值小于当前节点值,继续在左子树中查找 return searchNode(root->left, value, count + 1); } else { // 查找值大于当前节点值,继续在右子树中查找 return searchNode(root->right, value, count + 1); } }
int main() { int N; // 元素个数 scanf("%d", &N);
int* elements = (int*)malloc(N * sizeof(int)); // 待查找集合
for (int i = 0; i < N; i++) {
scanf("%d", &elements[i]);
}
int searchValue; // 待查值
scanf("%d", &searchValue);
TreeNode* root = NULL; // 二叉查找树的根节点
for (int i = 0; i < N; i++) {
root = insertNode(root, elements[i]); // 插入节点
}
int compareCount = searchNode(root, searchValue, 0); // 在二叉查找树中查找节点
printf("%d\n", compareCount);
free(elements); // 释放内存
return 0;
原文地址: https://www.cveoy.top/t/topic/hAjS 著作权归作者所有。请勿转载和采集!