记录的关键字序列为: 56,90,27,67,56,10,88,试构造一棵二叉排序树,并写出其 构造过程。
时间: 2023-12-03 14:02:29 浏览: 132
根据二叉排序树的定义,左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值。因此,我们可以按照以下步骤构造这棵二叉排序树:
1. 将第一个节点 56 作为根节点
2. 将下一个节点 90 与根节点比较,发现比根节点大,作为根节点的右子节点
3. 将下一个节点 27 与根节点比较,发现比根节点小,作为根节点的左子节点
4. 将下一个节点 67 与根节点比较,发现比根节点小但比左子节点大,作为左子节点的右子节点
5. 将下一个节点 56 与根节点比较,发现与根节点相同,作为左子节点的左子节点
6. 将下一个节点 10 与根节点比较,发现比根节点小,作为左子节点的左子节点的左子节点
7. 将下一个节点 88 与根节点比较,发现比根节点大但比右子节点小,作为右子节点的左子节点
最终得到的二叉排序树如下图所示:
```
56
/ \
27 90
/ \ \
10 56 88
/
67
```
相关问题
对于给定的关键字序列(56,13,64,5,32,92,21,80,88,75),构造一棵二叉排序树bt,并求bt在查找成功和失败情况下的平均查找长度。用c++语言
在C++中,为了构建二叉排序树(Binary Search Tree, BST)并计算查找成功和失败的平均查找长度,我们需要首先创建一个节点结构,然后按照BST的插入规则插入关键字,最后计算平均查找长度。这里是一个简单的示例:
```cpp
#include <iostream>
using namespace std;
// 定义二叉搜索树的节点
struct Node {
int key;
Node* left;
Node* right;
};
// 插入函数,用于构建BST
Node* insert(Node* root, int key) {
if (root == nullptr) return new Node{key, nullptr, nullptr};
if (key < root->key)
root->left = insert(root->left, key);
else
root->right = insert(root->right, key);
return root;
}
// 查找函数,返回NULL表示未找到
Node* search(Node* root, int key) {
if (root == nullptr || root->key == key)
return root;
if (root->key > key)
return search(root->left, key);
else
return search(root->right, key);
}
// 平均查找长度计算
double averageSearchLength(int* arr, int n, int target) {
int total_length = 0;
int success_count = 0;
for (int i = 0; i < n; ++i) {
if (search(nullptr, arr[i]) != nullptr)
success_count++;
total_length += binary_search(arr, 0, n - 1, arr[i]);
}
double avg_len = static_cast<double>(total_length) / n;
return success_count > 0 ? avg_len : n;
}
// 冒泡排序模拟查找算法(仅用于演示)
int binary_search(int* arr, int low, int high, int target) {
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target)
return mid + 1; // 因为已遍历过数组,所以加1
else if (arr[mid] < target)
low = mid + 1;
else
high = mid - 1;
}
return low; // 如果没找到,返回最后一个比target大的索引
}
int main() {
int arr[] = {56, 13, 64, 5, 32, 92, 21, 80, 88, 75};
int n = sizeof(arr) / sizeof(arr[0]);
Node* root = nullptr;
root = insert(root, arr[0]); // 构建BST
double avg_len = averageSearchLength(arr, n, 75); // 指定查找目标
cout << "Average search length on success: " << avg_len << endl;
// 计算所有元素的平均查找长度
avg_len = averageSearchLength(arr, n, -1);
cout << "Average search length in general: " << avg_len << endl;
return 0;
}
```
注意,这里的`binary_search`是一个模拟查找过程的简化版本,实际应用中可以使用更高效的查找算法如二分查找。同时,上述代码假设输入的关键字序列已经是有序的,因为我们在构建BST时依赖了这个假设。如果输入是无序的,需要先对数组进行排序。
C语言代码对输入的一个任意的关键字序列构造一棵二叉排序树,并且可以将该二叉排序树输出,实现查找算法。 要求各个操作均以函数的形式实现,在主函数中调用各个函数实现以下操作: (1) 任意输入关键字序列,建立二叉排序树,并按照中序遍历输出该二叉树。 (2) 在建立的二叉排序树中查找比数字(输入值,例如36),查找成功,则返回该数据,若未成功,则返回失败。 (3) 在有序表中查找数据元素(输入值,例如56),查找成功,则返回该数据,若未成功,则返回失败。
好的,以下是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 二叉排序树结构体
typedef struct BSTNode {
int data;
struct BSTNode *left;
struct BSTNode *right;
} BSTNode;
// 插入节点
BSTNode* insert(BSTNode *root, int data) {
if (root == NULL) {
root = (BSTNode*) malloc(sizeof(BSTNode));
root->data = data;
root->left = NULL;
root->right = NULL;
} else if (data < root->data) {
root->left = insert(root->left, data);
} else {
root->right = insert(root->right, data);
}
return root;
}
// 中序遍历二叉排序树
void inorder_traversal(BSTNode *root) {
if (root != NULL) {
inorder_traversal(root->left);
printf("%d ", root->data);
inorder_traversal(root->right);
}
}
// 在二叉排序树中查找数据元素,若查找成功,则返回该数据,否则返回-1
int search_bst(BSTNode *root, int target) {
while (root != NULL) {
if (root->data == target) {
printf("查找成功,该数据为:%d\n", root->data);
return root->data;
} else if (root->data < target) {
root = root->right;
} else {
root = root->left;
}
}
printf("查找失败\n");
return -1;
}
// 在有序表中查找数据元素,若查找成功,则返回该数据,否则返回-1
int search(int arr[], int n, int target) {
int i;
for (i = 0; i < n && arr[i] < target; i++);
if (i < n && arr[i] == target) {
printf("查找成功,该数据为:%d\n", arr[i]);
return arr[i];
} else {
printf("查找失败\n");
return -1;
}
}
int main() {
BSTNode *root = NULL;
int n, i, target;
printf("请输入关键字序列的长度:");
scanf("%d", &n);
printf("请输入关键字序列:");
for (i = 0; i < n; i++) {
int data;
scanf("%d", &data);
root = insert(root, data);
}
printf("中序遍历二叉排序树:");
inorder_traversal(root);
printf("\n请输入要在二叉排序树中查找的数字:");
scanf("%d", &target);
search_bst(root, target);
int arr[] = {5, 10, 11, 15, 17, 19, 21, 25, 36, 38, 50, 51, 55, 57, 68};
int len = sizeof(arr) / sizeof(arr[0]);
printf("请输入要在有序表中查找的数字:");
scanf("%d", &target);
search(arr, len, target);
return 0;
}
```
输出结果为:
```
请输入关键字序列的长度:7
请输入关键字序列:7 1 8 3 6 5 4
中序遍历二叉排序树:1 3 4 5 6 7 8
请输入要在二叉排序树中查找的数字:6
查找成功,该数据为:6
请输入要在有序表中查找的数字:56
查找失败
```
阅读全文