【数据结构实验】树(一)构建二叉查找树(BST)

news/2024/11/7 18:48:49/

文章目录

  • 1. 引言
  • 2. 二叉查找树
  • 3. 实验内容
    • 3.1 实验题目
      • (一)输入要求
      • (二)输出要求
    • 3.2 算法实现
      • 1. 数据结构
      • 2. 全局变量
      • 3. 中序遍历函数InOrder
      • 4. 二叉查找树的构建函数T
      • 5. 主函数
    • 3.3 代码整合
  • 4. 实验结果

1. 引言

  二叉查找树(Binary Search Tree,BST)是一种常用的数据结构,它在计算机科学和信息处理中有着广泛的应用。BST的特点是对于树中的每个节点,其左子树的所有节点值小于当前节点的值,而右子树的所有节点值大于当前节点的值。

本实验将通过C语言构建一个二叉查找树,分析其性能计算平均查找长度。

2. 二叉查找树

  二叉查找树(Binary Search Tree,BST)是一种二叉树,其中每个节点都包含一个键值(key)和对应的数据(value)。而且对于任意节点,其左子树中的所有节点的键值都小于该节点的键值,而右子树中的所有节点的键值都大于该节点的键值。
  二叉查找树的这种特性使得在查找、插入和删除节点时具有高效性。通过比较目标键值和当前节点的键值,可以在树中快速定位到目标节点或确定插入、删除的位置。在平均情况下,这些操作的时间复杂度为O(log n),其中n是二叉查找树中节点的数量。
  除了高效的查找操作,二叉查找树还支持有序性操作。通过中序遍历二叉查找树,可以按照键值的顺序输出树中的所有节点,从而实现对节点的有序访问。
  需要注意的是,如果二叉查找树的节点插入和删除不平衡,即树的高度不均衡地增长,可能会导致查找、插入和删除操作的最坏情况时间复杂度为O(n),其中n是树中节点的数量。为了解决这个问题,可以使用自平衡的二叉查找树,如红黑树(Red-Black Tree)或AVL树,来保持树的平衡性。

3. 实验内容

3.1 实验题目

   实现教材 287 页底部的算法 T,从无到有创建一棵二叉查找树,输出中根遍历序列,并编程计算查找成功时的平均查找长度。

(一)输入要求

    char *A[30]={"THE","OF","AND","TO","A","IN","THAT","IS","WAS","HE","FOR","IT","WITH","AS","HIS","ON","BE","AT","BY","I","THIS","HAD","NOT","ARE","BUT","FROM","OR","HAVE","AN","THEY",};

(二)输出要求

  1. 输出该二叉查找树的中根遍历序列;
  2. 输出该二叉查找树查找成功时的平均查找长度。

3.2 算法实现

1. 数据结构

typedef struct P {char *key;struct P* llink;struct P* rlink;
} P;

2. 全局变量

P *root;
int Sum = 0;

3. 中序遍历函数InOrder

void InOrder(P *t)
{if(t==NULL) return;else{InOrder(t->llink);printf("%s\n",t->key);InOrder(t->rlink);}
}
  • 递归地进行中序遍历,输出节点的关键词。

4. 二叉查找树的构建函数T

P* T(char *ch) {if (root == NULL) {root = (P*)malloc(sizeof(P));root->key = strdup(ch);root->llink = NULL;root->rlink = NULL;return NULL;}P* p = root;while (p != NULL) {Sum++;if (strcmp(ch, p->key) == 0)return p;if (strcmp(ch, p->key) < 0) {if (p->llink == NULL)break;elsep = p->llink;}else {if (p->rlink == NULL)break;elsep = p->rlink;}}P* q = (P*)malloc(sizeof(P));q->key = strdup(ch);q->llink = NULL;q->rlink = NULL;if (strcmp(ch, p->key) < 0)p->llink = q;elsep->rlink = q;return NULL;
}
  • 若树为空,直接创建根节点。
  • 若树不为空,根据二叉查找树的性质找到合适的位置插入新的节点。

5. 主函数

int main() {char *A[30]={"THE","OF","AND","TO","A","IN","THAT","IS","WAS","HE","FOR","IT","WITH","AS","HIS","ON","BE","AT","BY","I","THIS","HAD","NOT","ARE","BUT","FROM","OR","HAVE","AN","THEY",};int M = 30, i;for (i = 0; i < M; i++) {char *ch;ch = A[i];P* s = T(ch);}printf("中序遍历:\n");InOrder(root);Sum = 0;for (i = 0; i < M; i++) {char *ch;ch = A[i];P* s = T(ch);}printf("平均查找长度为%f", (float)Sum / M);// 释放节点的关键词内存for (i = 0; i < M; i++) {free(A[i]);}return 0;
}
  • 利用关键词数组 A 构建二叉查找树。
  • 输出中序遍历结果。
  • 再次构建二叉查找树,计算平均查找长度,并输出。

3.3 代码整合

#include<stdio.h>
#include<string.h>
#include<malloc.h>typedef struct P {char *key;struct P* llink;struct P* rlink;
} P;P *root;
int Sum = 0;void InOrder(P *t) {if (t == NULL)return;else {InOrder(t->llink);printf("%s\n", t->key);InOrder(t->rlink);}
}P* T(char *ch) {if (root == NULL) {root = (P*)malloc(sizeof(P));root->key = strdup(ch);root->llink = NULL;root->rlink = NULL;return NULL;}P* p = root;while (p != NULL) {Sum++;if (strcmp(ch, p->key) == 0)return p;if (strcmp(ch, p->key) < 0) {if (p->llink == NULL)break;elsep = p->llink;}else {if (p->rlink == NULL)break;elsep = p->rlink;}}P* q = (P*)malloc(sizeof(P));q->key = strdup(ch);q->llink = NULL;q->rlink = NULL;if (strcmp(ch, p->key) < 0)p->llink = q;elsep->rlink = q;return NULL;
}int main() {char *A[30]={"THE","OF","AND","TO","A","IN","THAT","IS","WAS","HE","FOR","IT","WITH","AS","HIS","ON","BE","AT","BY","I","THIS","HAD","NOT","ARE","BUT","FROM","OR","HAVE","AN","THEY",};int M = 30, i;for (i = 0; i < M; i++) {char *ch;ch = A[i];P* s = T(ch);}printf("中序遍历:\n");InOrder(root);Sum = 0;for (i = 0; i < M; i++) {char *ch;ch = A[i];P* s = T(ch);}printf("平均查找长度为%f", (float)Sum / M);// 释放节点的关键词内存for (i = 0; i < M; i++) {free(A[i]);}return 0;
}

4. 实验结果

在这里插入图片描述

中序遍历:
A
AN
AND
ARE
AS
AT
BE
BUT
BY
FOR
FROM
HAD
HAVE
HE
HIS
I
IN
IS
IT
NOT
OF
ON
OR
THAT
THE
THEY
THIS
TO
WAS
WITH
平均查找长度为5.433333

http://www.ppmy.cn/news/1241506.html

相关文章

#define例题

我们已经学了#define的所有知识&#xff0c;让我们来看这道题&#xff0c;可不要又陷入陷阱 题目要求&#xff1a; #define N 4 #define Y(n) ((N2)*n) int main() {int z 2 * (N Y(5 1));printf("z%d\n", z);return 0; } 求这个z的值是多少&#xff1f; 我们直接…

精准人脉引流软件的开发流程与涉及到的技术

一、精准人脉引流软件的开发流程 1. 确定需求&#xff1a;首先&#xff0c;我们需要明确软件的需求&#xff0c;包括目标用户、功能需求、性能需求等。这些需求将直接影响到软件的开发方向和最终效果。 2. 系统设计&#xff1a;根据需求&#xff0c;进行系统设计&#xff0c;…

【计算机网络笔记】多路访问控制(MAC)协议——随机访问MAC协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

万字解析设计模式之模板方法与解释器模式

一、模板方法模式 1.1概述 定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 例如&#xff0c;去银行办理业务一般要经过以下4个流程&#xff1a;取号、排队、办理具体业…

“升级图片质量:批量提高或缩小像素,赋予图片全新生命力!“

如果你想让你的图片更加清晰、更加美观&#xff0c;或者符合特定的像素要求&#xff0c;那么现在有一个好消息要告诉你&#xff01;我们推出了一款全新的图片处理工具&#xff0c;可以帮助你批量提高或缩小图片像素&#xff0c;让你的图片焕发出新的生机&#xff01; 第一步&a…

HarmonyOS ArkTS 保存应用数据(十)

1 概述 在移动互联网蓬勃发展的今天&#xff0c;移动应用给我们生活带来了极大的便利&#xff0c;这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置&#xff0c;HarmonyOS应用开发也不例外。 2 什么是首选项 首选项为应用提供Key-Value键…

Vue3的计算属性(computed)和监听器(watch)案例语法

一&#xff1a;前言 Vue3 是 Vue2 的一个升级版&#xff0c;随着 2023年12月31日起 Vue2 停止维护。这意味着 Vue3 将会为未来国内一段时间里&#xff0c;前端的开发主流。因此熟练的掌握好 Vue3 是前端开发程序员所不可避免的一门技术栈。而 Vue3 是 Vue2 的一个升级版&#x…

云原生系列Go语言篇-编写测试Part 2

基准测试 确定代码是快或慢非常复杂。我们不用自己计算&#xff0c;应使用Go测试框架内置的基准测试。下面来看​​第15章的GitHub代码库​​sample_code/bench目录下的函数&#xff1a; func FileLen(f string, bufsize int) (int, error) {file, err : os.Open(f)if err ! …