给定关键字序列{55,25,6,95,76,12,124,32} (1)构造一棵二叉排序树。 (2)查找13的查找路径。(结点用逗号分隔,如:40,60,90,120)
时间: 2024-05-13 11:20:18 浏览: 10
回答:好的,我会尽力回答你的问题。
针对问题1:
(1) 构造一棵二叉排序树:
首先选取第一个关键字55作为根节点,然后将剩下的关键字分别与根节点比较:
25小于55,所以将25插入根节点的左子树;
6小于55,所以将6插入根节点的左子树的左子树;
95大于55,所以将95插入根节点的右子树;
76大于55,所以将76插入根节点的右子树的左子树;
12小于55,所以将12插入根节点的左子树的右子树;
124大于55,所以将124插入根节点的右子树的右子树;
32小于55,所以将32插入根节点的左子树的左子树的右子树。
最终构造出的二叉排序树如下图所示:
```
55
/ \
25 95
/ \ / \
6 12 76 124
\
32
```
(2) 查找13的查找路径:
在二叉排序树中查找关键字13的查找路径如下:
当前节点为根节点55,13小于55,所以向左子树查找。
当前节点为25,13小于25,所以向左子树查找。
当前节点为6,13大于6,所以向右子树查找。
当前节点为12,13小于12,但是12无右子树,查找到了叶节点,停止查找。
因此,找不到关键字为13的查找路径。
相关问题
给定关键字序列{55,25,6,95,76,12,124,32}构造一棵二叉排序树
好的,我可以回答这个问题。首先,我们需要找出这些关键字的排列顺序,以便将它们插入到二叉排序树中。从最小的关键字开始,我们可以将6插入到树的根节点,然后按照以下顺序插入其余的关键字:12,25,32,55,76,95和124。这样,我们就得到了如下的二叉排序树:
6
/ \
12 25
\ / \
55 76 95
\
124
希望我的回答对您有帮助。
用c语言编写一个程序,对于给定的关键字序列,构造一棵二叉排序树bt,并求bt在查找成功和失败情况下的平均查找长度
好的,我理解了你的问题。下面是用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` 函数,计算二叉排序树在查找成功和失败情况下的平均查找长度,并输出结果。
需要注意的是,这个程序中假设关键字序列中的每个关键字都是不同的。如果关键字序列中有相同的关键字,程序运行结果可能会出现不一致的情况。