题目3(二叉排序树)[问题描述]

利用二叉查找树(又称为二叉排序树、二叉搜索树)实现对输入的英文单词进行搜索,同时可给出单词出现的次数。(难易程度:高)

[实验目的]

1、掌握二叉链表的存储结构。
2、掌握搜索和过滤的方法。
3、掌握二叉排序树的插入和删除操作。

[实验内容及要求]

1、构造二叉查找树

(1)从文本文件中读入文本内容,能够分离出单词,过滤掉阿拉伯数字和标点符号,并将英文字母的大写形式全部转换成小写形式。

(2)按照英文字母表的顺序构造英文单词的二叉查找树。当两个英文单词的首字母相同时,按第二个字母进行排序,依次类推。

(3)当待插入的单词已在二叉查找树中,则将该单词的出现次数增1。

2、遍历二叉查找树

(1)搜索:输入一个待检索单词,在二叉查找树中进行查找,如果能找到该单词,则输出该单词及其出现次数;

(2)实现二叉查找树的中序遍历,并将遍历结果输出到屏幕上,包括单词和单词出现的位置。

3、删除结点:

给定一个停用词列表(停用词是指对搜索没有作用的词,如: of , and , a , an , the 等等),将二叉查找树中的属于停用词表中的单词依次删除。

4、可以显示菜单,在菜单中可以进行如下四项操作(但并不局限这些操作):

(1)读入文本内容,包含若干英文单词、标点符号以及阿拉伯数字,用于构建二叉查找树。

(2)输入停用词,每个停用词占一行。对于每个停用词,都需要删除二叉查找树中的相应结点,即:每输入一个停用词,执行一次删除结点的操作。

(3)中序遍历二叉查找树,遍历结果中的每个单词占一行,先输出该单词,然后输出一个空格,再输出该单词出现的次数。

(4)输入查询词。对每个查询词,都需要在二叉查找树中的搜索相应结点,如果找到,则输出该单词及其出现次数;如果未找到,则输出相应的信息。每个查询词的查询结果占一行,先输出该单词,然后输出一个空格,再输出该单词出现的次数。

[测试数据]

1、输入的文本含有大小写字母、阿拉伯数字、标点符号及其它字符。
2、单词的数量应当足够多,并有一定量的相同单词。

#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdlib>
using namespace std;typedef struct BST {int cnt;string data;BST* lchild, * rchild;
}BSTNode,*BSTree;bool BST_Insert(BSTree& T, string data){if (T == NULL)   {T = new BSTNode;T->data = data;T->cnt = 1;T->lchild = T->rchild = NULL;return true;}else if (data < T->data) {return BST_Insert(T->lchild, data);}else if (data > T->data) {return BST_Insert(T->rchild, data);}else {// 已存在值不插入T->cnt++;return false;}
}bool BST_Dele(BSTree& T, string data){if (T == NULL) return false;if (T->data == data){BSTree p, q;  // 前驱 后继//如果左右儿子都有比较难删除if (T->lchild && T->rchild){p = T;q = p->lchild;while (q->rchild) { // 寻找左子树最大    p = q;q = q->rchild;}T->data = q->data;T->cnt = 0;if (p != T) {p->rchild = q->lchild;}else {p->lchild = q->lchild;}delete(q);}else if (T->lchild) {  //只有左儿子p = T;T = T->lchild;delete(p);}else { //只有右儿子或左右儿子都没有(叶子)p = T;T = T->rchild;delete(p);}return true;}else if (data < T->data) {return BST_Dele(T->lchild, data);}else if (data > T->data) {return BST_Dele(T->rchild, data);}
}void _Order(BSTree& T){if (T != NULL) {_Order(T->lchild);if(T->cnt!=0||T->data!="")cout << T->data << " " << T->cnt << endl;_Order(T->rchild);}
}
void Prior_Order1(BSTree& T,string s){if (T != NULL) {if(T->data==s)cout << T->data << " " << T->cnt << endl;Prior_Order1(T->lchild,s);Prior_Order1(T->rchild,s);}
}
int Get_word(string &temp_s,FILE *in){//bug可能是这里产生的,但我不知道错在哪里了int i=0;char s;s=fgetc(in);while(!isalpha(s)){s=fgetc(in);if(s==EOF)return 1;}while(isalpha(s)&&!isspace(s)){s=tolower(s);temp_s.push_back(s);s=fgetc(in);}return 0;
}int main()
{//-----------------简单测试函数-----------------// BSTree T = NULL;// string s, ss;// for (int i = 0; i < 10; i++)// {//  cin >> s;//   BST_Insert(T, s);// }// for (int i = 0; i < 1;i++)// {//  cin >> ss;//  BST_Dele(T, ss);// }//  Prior_Order(T);// return 0;//----------------end----------------------------BSTree T = NULL;string ss, sss;int number;FILE *in;int i,j,key;if((in=fopen("essay.txt", "r"))==NULL)printf("No such file!\n");while (!feof(in)){//文件读入后创建二叉搜索树有一个小bug//运行结果有一个诡异的结点string temp_s;Get_word(temp_s,in);BST_Insert(T, temp_s);      }fclose(in);_Order(T);printf("请输入你想停用的单词的个数:\n");int t;cin >> t;while(t--){cout << "请输入停用单词:";cin >> sss;BST_Dele(T, sss);}_Order(T);printf("你想查询单词的数量是:");scanf("%d",&number);for (int i=0;i<number;i++){cout << "要查询的单词:";cin >> ss;Prior_Order1(T, ss);}return 0;
}

测试样例:

Tale of Two Cities (1859) is a novel by Charles Dickens, set in London and Paris before and during the French Revolution. With well over 200 million copies sold, it ranks among the most famous works in the history of fictional literature.The novel depicts the plight of the French peasantry demoralised by the French aristocracy in the years leading up to the revolution, the corresponding brutality demonstrated by the revolutionaries toward the former aristocrats in the early years of the revolution, and many unflattering social parallels with life in London during the same time period.

运行结果:

 1                   //bug所在地,这里的输出莫名其妙,我感觉是读入了空字符
a 1
among 1
and 3
aristocracy 1
aristocrats 1
before 1
brutality 1
by 3
charles 1
cities 1
copies 1
corresponding 1
demonstrated 1
demoralised 1
depicts 1
dickens 1
during 2
early 1
famous 1
fictional 1
former 1
french 3
history 1
in 5
is 1
it 1
leading 1
life 1
literature 1
london 2
many 1
million 1
most 1
novel 2
of 4
over 1
parallels 1
paris 1
peasantry 1
period 1
plight 1
ranks 1
revolution 3
revolutionaries 1
same 1
set 1
social 1
sold 1
tale 1
the 15
time 1
to 1
toward 1
two 1
unflattering 1
up 1
well 1
with 2
works 1
years 2请输入你想停用的单词的个数:
2
请输入停用单词:of
请输入停用单词:to1                 //bug所在地,如果停用a,那么这行会和第二行一起删掉
a 1
among 1
and 3
aristocracy 1
aristocrats 1
before 1
brutality 1
by 3
charles 1
cities 1
copies 1
corresponding 1
demonstrated 1
demoralised 1
depicts 1
dickens 1
during 2
early 1
famous 1
fictional 1
former 1
french 3
history 1
in 5
is 1
it 1
leading 1
life 1
literature 1
london 2
many 1
million 1
most 1
novel 0
over 1
parallels 1
paris 1
peasantry 1
period 1
plight 1
ranks 1
revolution 3
revolutionaries 1
same 1
set 1
social 1
sold 1
tale 1
the 15
time 0
toward 1
two 1
unflattering 1
up 1
well 1
with 2
works 1
years 2
你想查询单词的数量是:3
要查询的单词:of
要查询的单词:to
要查询的单词:a
a 1
 1                           //此时还有问题
a 1
among 1
and 3
aristocracy 1
aristocrats 1
before 1
brutality 1
by 3
charles 1
cities 1
copies 1
corresponding 1
demonstrated 1
demoralised 1
depicts 1
dickens 1
during 2
early 1
famous 1
fictional 1
former 1
french 3
history 1
in 5
is 1
it 1
leading 1
life 1
literature 1
london 2
many 1
million 1
most 1
novel 2
of 4
over 1
parallels 1
paris 1
peasantry 1
period 1
plight 1
ranks 1
revolution 3
revolutionaries 1
same 1
set 1
social 1
sold 1
tale 1
the 15
time 1
to 1
toward 1
two 1
unflattering 1
up 1
well 1
with 2
works 1
years 2请输入你想停用的单词的个数:
2
请输入停用单词:a
请输入停用单词:of//问题行很神奇的没有了
among 1
and 3
aristocracy 1
aristocrats 1
before 1
brutality 1
by 3
charles 1
cities 1
copies 1
corresponding 1
demonstrated 1
demoralised 1
depicts 1
dickens 1
during 2
early 1
famous 1
fictional 1
former 1
french 3
history 1
in 5
is 1
it 1
leading 1
life 1
literature 1
london 2
many 1
million 1
most 1
novel 0
over 1
parallels 1
paris 1
peasantry 1
period 1
plight 1
ranks 1
revolution 3
revolutionaries 1
same 1
set 1
social 1
sold 1
tale 1
the 15
time 1
to 1
toward 1
two 1
unflattering 1
up 1
well 1
with 2
works 1
years 2
你想查询单词的数量是:3
要查询的单词:a
要查询的单词:to
to 1
要查询的单词:of

更多数据结构代码实现请关注我的专栏数据结构

或者进入2021-10-16【严蔚敏数据结构代码实现合集】【c语言学习必备】学习

2021-11-24【数据结构练习题】【二叉搜索树的插入删除】相关推荐

  1. 二叉搜索树(创建,插入,删除):基础篇,适合新手观看。

    1.1 二叉搜索树的插入 二叉搜索树的概念相信大家都很清楚,无非就是左小右大 创建二叉搜索树,其实就是多次调用二叉搜索树的插入方法,所以首先我们来讲讲如何插入节点到二叉搜索树里,假设一颗二叉搜索树如下 ...

  2. 数据结构之二叉搜索树(BST)

    数据结构之二叉搜索树(BST) 1. 二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: ( ...

  3. js遍历树节点下的所有子节点_「Javascript数据结构」× 二叉搜索树

    目录 树的相关术语 二叉树和二叉搜索树 二叉树的遍历 二叉搜索树的搜索 二叉搜索树的移除 「 树的相关术语 」 一个树结构包含一些列存在父子关系的节点.每个节点都有一个父节点(除了顶部的第一个节点)以 ...

  4. 【数据结构】二叉搜索树的python实现

    [数据结构]二叉搜索树的python实现 二叉搜索树是以二叉树来组织的,对于一个二叉搜索树的节点,其左子树节点的元素值都不大于该节点元素值,其右子树节点的元素值都不小于该节点的元素值. 首先定义一个初 ...

  5. 请回答数据结构【二叉搜索树】

    请回答数据结构[二叉搜索树] 1. BinarySearchTree(二叉排序树) 1.0 Intro 1.1 concept 2. 二叉搜索树快速入门 2.1 查找 2.2 BSTree应用 3. ...

  6. 【数据结构】二叉搜索树的实现

    目录 一.二叉搜索树的概念 二.二叉搜索树的中序遍历用于排序+去重 三.二叉搜索树的查找 1.查找的非递归写法 2.查找的递归写法 四.二叉搜索树的插入 1.插入的非递归写法 2.插入的递归写法 五. ...

  7. 数据结构之二叉搜索树

    二叉搜索树 一棵二叉树,可以为空:如果不为空,满足以下性质: 1. 非空左子树的所有键值小于其根结点的键值. 2. 非空右子树的所有键值大于其根结点的键值. 3. 左.右子树都是二叉搜索树. 二叉搜索 ...

  8. 数据结构->二叉搜索树->平衡二叉搜索树->红黑树的C++实现

    节点的定义: RBTreeNode.h // // Created by 24588 on 2022/1/12. //#ifndef TEST_RBTREENODE_H #define TEST_RB ...

  9. 二叉搜索树的插入与删除图解

    =================================================================== 一.二叉搜索树(BSTree)的概念        二叉搜索树又 ...

  10. 数据结构之二叉搜索树/二叉查找数/有序二叉树/排序二叉树

    概念~ 二叉查找树(英语:Binary Search Tree),也称二叉搜索树.有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree), ...

最新文章

  1. 《深入理解计算机网络》读书笔记一
  2. SIFT(Scale-invariant feature transform, 尺度不变特征转换)特征
  3. 03-1.JavaScript基础语法略写/模版字符串
  4. 查询去除空值_SQL数据处理(五):SQL多表查询
  5. 《虚拟化与云计算》读书感(九)服务器虚拟化的其他核心技术
  6. c语言学习-编写函数求x的n次方的值
  7. Finereport安装
  8. Linux(CentOS7)虚拟机安装详解
  9. Linux上,最常用的一批命令解析
  10. java高校水电费管理系统设计6_高校水电费管理.doc
  11. wpsppt放映时间_利用WPS演示制作PPT计时器的两种方法
  12. Hadoop Shell总结
  13. journalctl工具基础介绍
  14. android 7.0楷体字体,Win7系统怎么设置字体为楷体gb2312
  15. jchdl - GSL实例 - Shifter
  16. 破解win7开机密码
  17. Dev的panelcontrol
  18. 《圣斗士》黄金圣斗士美图赏
  19. Java实现图书借阅管理系统(IO流存储数据,附源码)
  20. Preisach模型

热门文章

  1. 无限循环小数四则运算_无限循环小数不能进行四则运算
  2. JS之获取银行卡信息
  3. C# 基础学习第四天
  4. C-7统计元音字母个数
  5. c语言中primesum函数,c语言之函数
  6. CSDN 社区年终总结|回顾 2021
  7. AI换脸骗过App,林俊杰和我们都怕
  8. 【精品软件】鼠标右键菜单设置管理工具
  9. 2021-09-14TL431与LM317的区别
  10. 史上五大最光明的白帽黑客介绍 都有很大技术贡献