用c语言编写一个程序,对于给定的关键字序列,构造一棵二叉排序树bt,并求bt在查找成功和失败情况下的平均查找长度
时间: 2024-03-02 20:54:01 浏览: 84
好的,我理解了你的问题。下面是用C语言编写的程序,可以实现你的需求:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉树结点定义
typedef struct node {
char data;
struct node *left;
struct node *right;
} Node;
// 二叉排序树定义
typedef struct {
Node *root;
} BST;
// 初始化二叉排序树
void initBST(BST *bst) {
bst->root = NULL;
}
// 创建新结点
Node *newNode(char data) {
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 插入结点
void insertNode(BST *bst, char data) {
Node *node = newNode(data);
if (bst->root == NULL) {
bst->root = node;
} else {
Node *p = bst->root;
Node *prev = NULL;
while (p != NULL) {
prev = p;
if (data < p->data) {
p = p->left;
} else {
p = p->right;
}
}
if (data < prev->data) {
prev->left = node;
} else {
prev->right = node;
}
}
}
// 计算二叉排序树的深度
int depth(Node *node) {
if (node == NULL) {
return 0;
}
int leftDepth = depth(node->left);
int rightDepth = depth(node->right);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
// 计算二叉排序树的总结点数
int countNodes(Node *node) {
if (node == NULL) {
return 0;
}
return countNodes(node->left) + countNodes(node->right) + 1;
}
// 计算二叉排序树在查找成功情况下的平均查找长度
float avgSearchLengthSucceed(BST *bst) {
int nodes = countNodes(bst->root);
int depth = depth(bst->root);
return (float)depth / nodes + 1;
}
// 计算二叉排序树在查找失败情况下的平均查找长度
float avgSearchLengthFail(BST *bst) {
int nodes = countNodes(bst->root);
return (float)nodes / 2 + 0.5;
}
int main() {
// 初始化二叉排序树
BST bst;
initBST(&bst);
// 插入关键字序列
char keywords[] = {'D', 'B', 'A', 'C', 'F', 'E', 'G'};
int n = sizeof(keywords) / sizeof(char);
for (int i = 0; i < n; i++) {
insertNode(&bst, keywords[i]);
}
// 计算平均查找长度
float avg1 = avgSearchLengthSucceed(&bst);
float avg2 = avgSearchLengthFail(&bst);
printf("平均查找长度(查找成功):%.2f\n", avg1);
printf("平均查找长度(查找失败):%.2f\n", avg2);
return 0;
}
```
这个程序会先初始化一个二叉排序树(BST),然后插入给定的关键字序列,最后计算二叉排序树在查找成功和失败情况下的平均查找长度。
具体来说,这个程序会定义一个二叉树结点(Node)和一个二叉排序树(BST)。二叉树结点包含一个字符数据(data),以及左右子结点指针(left、right)。二叉排序树包含一个根结点指针(root)。
程序中还定义了一些函数,包括:
- `initBST`:初始化二叉排序树。
- `newNode`:创建新的二叉树结点。
- `insertNode`:向二叉排序树中插入一个结点。
- `depth`:计算二叉排序树的深度。
- `countNodes`:计算二叉排序树的总结点数。
- `avgSearchLengthSucceed`:计算二叉排序树在查找成功情况下的平均查找长度。
- `avgSearchLengthFail`:计算二叉排序树在查找失败情况下的平均查找长度。
在 `main` 函数中,程序会先初始化二叉排序树,然后插入给定的关键字序列。最后,程序会调用 `avgSearchLengthSucceed` 和 `avgSearchLengthFail` 函数,计算二叉排序树在查找成功和失败情况下的平均查找长度,并输出结果。
需要注意的是,这个程序中假设关键字序列中的每个关键字都是不同的。如果关键字序列中有相同的关键字,程序运行结果可能会出现不一致的情况。
阅读全文