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

文章目录

  • 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.hqwc.cn/news/218529.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python之静态服务器程序开发

文章目录 Python静态Web服务器开发Web静态服务器初识搭建Python自带的静态Web服务器静态Web服务器返回固定页面数据静态Web服务器返回指定页面数据静态Web服务器多任务版静态Web服务器面向对象开发静态Web服务器命令行启动动态绑定端口号 Python静态Web服务器开发 Web静态服务…

Java多态:多态多态,多么变态

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、重写1、重写的规则2、重写与重载的区别 二、多态1、多态的概念2、多态的实现3、向上转移和向下转型Ⅰ、向上转型Ⅱ、向下转…

Error PostCSS plugin autoprefixer requires PostCSS 8

文章目录 一、情况一二、情况二三、总结 在启动 vue项目时&#xff0c;突然控制台报错&#xff1a; Error: PostCSS plugin autoprefixer requires PostCSS 8。然后依次出现下面几种情况&#xff0c;依次解决完&#xff0c;项目就可以正常启动了 一、情况一 error in ./src/…

C++ STL-----容器

STL容器就是将运用最广泛的一些数据结构实现出来 常用的数据结构&#xff1a;数组, 链表,树, 栈, 队列, 集合, 映射表 等 这些容器分为序列式容器和关联式容器两种: 序列式容器:强调值的排序&#xff0c;序列式容器中的每个元素均有固定的位置。 关联式容器:二叉树结构&…

AIGC原理:扩散模型diffusion综述一:面向视觉计算的扩散模型研究进展

论文地址&#xff1a;State of the Art on Diffusion Models for Visual Computing &#x1f449; 贴一幅SGM&#xff08;Score-based Generative Model&#xff09;的原因是宋飏博士将他2019年提出的SMLD模型和2020年Jonathan Ho提出的DDPM采用SDE进行一统这两大极为相似的生成…

(2023码蹄杯)省赛(初赛)第三场真题(原题)(题解+AC代码)

题目1&#xff1a;MC0227堆煤球 码题集OJ-堆煤球 (matiji.net) 思路&#xff1a; 1.i从l枚举到r,i是8的倍数就跳过&#xff0c;i不是8的倍数就用等差数列求和公式i(1i)/2,最后累加到答案中即可 AC_Code:C #include<bits/stdc.h> using namespace std;int main( ) {in…

深度学习第二天:RNN循环神经网络

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 介绍 记忆功能对比展现 任务描述 导入库 处理数据 前馈神经网络 循环神经网络 编译与训练模型 模型预测 可能的问题 梯度消失 梯…

spring-framework-5.2.25.RELEASE源码环境搭建

环境准备 spring-framework-5.2.25.RELEASEIntelliJ IDEA 2022.3.1java version “11.0.20” 2023-07-18 LTSGradle 5.6.4java version “1.8.0_301” 下载spring-framework-5.2.25.RELEASE源码 git clone https://gitee.com/QQ952051088/spring.git cd spring gradlew buil…

文件批量改名方法:文件自动批量重命名,提升文件管理效率

在日常工作中随着工作时间的推移&#xff0c;在文件数量日益增长的情况下&#xff0c;会在电脑中积累大量的文件。如果文件名混乱无序&#xff0c;查找和识别重要文件将变得非常困难。这不仅会浪费大量的时间和精力&#xff0c;还可能导致重要文件的丢失或混乱。文件批量改名可…

cmake install接口常用方式介绍

cmake install接口常用方式介绍 1 Synopsis2 Introduction2.1 DESTINATION <dir>2.2 PERMISSIONS <permission>...2.3 CONFIGURATIONS <config>...2.4 COMPONENT <component>2.5 EXCLUDE_FROM_ALL2.6 RENAME <name>2.7 OPTIONAL 3 Signatures4 E…

西安数字孪生赋能工业制造,加速推进制造业数字化转型

西安数字孪生、5G、工业物联网、工业互联网等新一代信息通信技术与工业制造业经济深度融合&#xff0c;通过对人、机、物、系统等全面连接&#xff0c;构建覆盖全产业链、全价值链的全新制造和服务体系&#xff0c;为工业乃至产业数字化、网络化、智能化发展提供实现途径&#…

【数据库篇】关系模式的表示——(2)规范化

范式&#xff1a;范式是符合某一种级别的关系模式的集合 规范化&#xff1a;是指一个低一级的范式的关系模式&#xff0c;通过模式的分解转换为若干个高一级范式的关系模式的集合。 1NF 每个分量必须是不可分开的数据项&#xff0c;满足这个条件的关系模式就是1NF。 2NF 若…