序列A:9 19 24 89 33 49 57 序列B:69 43 54 31 87 74 77 按序列A和序列B,分别画出其构造的二叉排序树,以及序列A构造的平衡二叉树,并计算出其查找成功和不成功的平均查找长度。写出一个完整程序,实现二叉排序树的结构定义、创建和后序遍历算法,
时间: 2024-06-06 14:06:29 浏览: 130
二叉排序树和平衡二叉树的构造:
二叉排序树的构造:
首先将序列A的第一个元素作为二叉排序树的根节点,从第二个元素开始依次插入到二叉排序树中。对于每个插入的元素,从根节点开始比较大小,如果比根节点小就往左子树插入,如果比根节点大就往右子树插入,直到找到一个空的位置插入元素。
序列A的二叉排序树:
9
/ \
/ \
/ \
19 24
\ \
\ \
33 89
/ \ /
/ \ /
49 57 77
同样的方法,将序列B的元素依次插入到二叉排序树中。
序列B的二叉排序树:
69
/ \
/ \
/ \
43 87
\ / \
\ / \
54 74 77
/
/
31
平衡二叉树的构造:
首先将序列A按照升序排序,然后将排序后的序列分成两部分,以中间的元素为根节点,左边的部分为左子树,右边的部分为右子树。递归地对左右子序列进行同样的处理,直到序列中只剩下一个元素或没有元素。
序列A的平衡二叉树:
49
/ \
/ \
/ \
/ \
19 57
/ \ / \
9 33 24 89
查找成功和不成功的平均查找长度:
在二叉排序树中,查找成功的平均查找长度为O(logn),其中n为节点数。查找不成功时,平均查找长度为树的深度,最坏情况下为O(n)。
在平衡二叉树中,每个节点的左右子树高度差不超过1,因此树的高度为O(logn),查找成功和不成功时的平均查找长度均为O(logn)。
完整程序实现:
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
void insert(TreeNode** root, int data) {
if (*root == NULL) {
*root = (TreeNode*)malloc(sizeof(TreeNode));
(*root)->data = data;
(*root)->left = NULL;
(*root)->right = NULL;
}
else if (data < (*root)->data) {
insert(&((*root)->left), data);
}
else if (data > (*root)->data) {
insert(&((*root)->right), data);
}
}
void postorderTraversal(TreeNode* root) {
if (root != NULL) {
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->data);
}
}
int main() {
// 构造二叉排序树
int a[] = { 9, 19, 24, 89, 33, 49, 57 };
int n = sizeof(a) / sizeof(int);
TreeNode* root1 = NULL;
for (int i = 0; i < n; i++) {
insert(&root1, a[i]);
}
printf("二叉排序树的后序遍历:");
postorderTraversal(root1);
printf("\n");
// 构造平衡二叉树
int b[] = { 69, 43, 54, 31, 87, 74, 77 };
n = sizeof(b) / sizeof(int);
int* sorted = (int*)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
sorted[i] = b[i];
}
qsort(sorted, n, sizeof(int), cmp);
TreeNode* root2 = sortedArrayToBST(sorted, n);
printf("平衡二叉树的后序遍历:");
postorderTraversal(root2);
printf("\n");
// 释放内存
free(sorted);
destroyTree(root1);
destroyTree(root2);
return 0;
}
阅读全文