hnust 1073: 查找

news2024/10/6 6:19:48

hnust 1073: 查找

题目描述
给定一个集合,查找元素是否在集合中出现。

输入
每个测试用例由多行组成,第一行是两个整数n和m,两个数范围在1到100000之间。自第二行起一共有n+m个整数,其中前面n个整数代表集合的元素,随后的m个整数是待查询的数。所有的整数在范围[-231,231)内。

输出
对于每个待查询的数,如果在集合中则输出yes,否则输出no.

样例输入 Copy
5 3
7 9 3 2 -5
4 9 -5
5 3
-2 1 0 -2 1
0 -2 3
样例输出 Copy
no
yes
yes
yes
yes
no
提示
注意,需要快速的查找算法!效率不高的查找算法可能会超时!

解题过程

1、什么是二叉搜索树
二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树。
二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:
非空左子树的所有键值小于其根结点的键值。
非空右子树的所有键值大于其根结点的键值。
左、右子树都是二叉搜索树。

2.二叉搜索树操作

2.1 二叉搜索树的查找
从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
最多查找高度次,走到空,还没找到,则这个值不存在。
2.2 二叉搜索树的插入
插入的具体过程如下:
树为空,则直接新增节点,赋值给root指针
树不为空,按二叉搜索树性质查找插入的位置,插入新节点(记录父节点,判断插入的节点应该在父节点的左子树还是右子树)

2.3 二叉搜索树的删除

首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情
况:
a. 要删除的结点无孩子结点
b. 要删除的结点只有左孩子结点
c. 要删除的结点只有右孩子结点
d. 要删除的结点有左、右孩子结点

看似删除节点有4种情况,但实际上a和b和c可以合并,这样就只有2种情况了:
a:待删除的结点无孩子/只有一个孩子:删除结点并使父亲结点指向被删除结点的孩子结点(无孩子视为孩子是空结点,任意指向一个即可)
b:待删除的结点有左右孩子:采用替换法,寻找删除结点右子树的最小结点(右子树最左结点),将最小结点的值和删除结点的值替换,然后删除最小结点(此时最小结点,要么没有孩子,要么只有一个孩子,符合a情况可以直接删除)

二叉搜索树(Binary Search Tree, BST)的基本操作,包括树的创建、插入新元素、搜索特定元素以及主函数中对这些操作的测试。
以下是对代码的详细解析:

  1. 头文件和命名空间

    • 包含 <iostream><cstdlib><cstdio> 头文件。
    • 使用 using namespace std; 来避免在标准库类型和函数前加 std::
  2. 宏定义

    • ENDFLAG 被定义为0,但在代码中没有使用。
  3. 数据类型定义

    • KeyType 用作二叉搜索树中节点数据的类型,这里设为 int
  4. 二叉树节点结构体 BSTNode

    • 包含一个 KeyType data 成员用于存储节点数据,以及两个指向左右子节点的指针 lchildrchild
  5. 二叉搜索树类型定义

    • BSTree 是指向 BSTNode 的指针类型。
  6. 插入函数 InsertBST

    • 递归函数,用于在二叉搜索树 T 中插入新元素 e
    • 如果树为空,创建新节点并插入。
    • 如果元素小于当前节点数据,递归地在左子树插入。
    • 如果元素大于当前节点数据,递归地在右子树插入。
  7. 创建二叉搜索树函数 CreateBST

    • 读取一个 KeyType e,然后调用 InsertBST 函数将其插入树 T 中。
  8. 搜索函数 SearchBST

    • 递归函数,用于在二叉搜索树 T 中搜索关键字 key
    • 如果树为空或找到关键字,返回相应的状态码。
  9. 主函数 main

    • 读取两个整数 nk,分别表示要插入的元素数量和搜索次数。
    • 使用循环调用 CreateBST 函数 n 次,构建二叉搜索树。
    • 使用另一个循环读取 k 个关键字,并调用 SearchBST 函数搜索它们。
    • 输出每个搜索结果,找到返回1,否则返回0。
  10. 程序结束

    • 输入结束后,程序返回0,表示正常结束。

代码逻辑分析

  • 这段代码通过递归的方式实现了二叉搜索树的插入和搜索操作。
  • 使用了结构体和指针来表示二叉树的节点和整体结构。

潜在问题

  • 代码没有提供 swap 函数的实现,尽管在 InsertBST 函数的注释中提到了它。
  • 没有实现删除节点的功能,这在实际应用中可能是必需的。

改进建议

  • 考虑实现一个 swap 函数,如果需要在 InsertBST 中使用。
  • 考虑实现删除节点的功能,以处理二叉搜索树中不需要的元素。
  • 考虑增加对输入有效性的检查,确保读取的是有效的整数。
  • 考虑使用 std::vector 来自动管理内存,简化代码并减少内存管理的复杂性。

部分代码

void InsertBST(BSTree &T,KeyType e)
{//当二叉排序树T不存在关键字等于e.key的数据元素时,插入该元素 
    BSTree S;
    if(T==NULL)
    {                          //找到插入位置,递归结束 
     S=new BSTNode;            //生成新节点*S 
     S->data =e ;               
     S->lchild =S->rchild =NULL;   //新节点作为叶子结点 
     T=S;                        //把新结点*S链接到已找到的插入位置    
    }
    else if(e <T->data ) InsertBST(T->lchild,e);
    else if(e >T->data ) InsertBST(T->rchild,e);
}
void CreateBST(BSTree &T)//BST的创建 
{
    KeyType e;
                       
    cin>>e;
    InsertBST(T,e);     
     
 } 
int SearchBST(BSTree T,KeyType key) //递归查找 
{
    if(!T) return 0; 
    else if(key==T->data )
    return 1;
    else if(key<T->data ) 
    return SearchBST(T->lchild ,key);
    else
    return SearchBST(T->rchild,key);
     
}

AC代码

#include<iostream> 
#include<cstdlib>
#include<cstdio>
using namespace std;
  
#define ENDFLAG 0
typedef int KeyType;
  
typedef struct BSTNode{
    KeyType data;//节点的数据域 
    struct BSTNode *lchild,*rchild; //左右孩子指针 
}BSTNode,*BSTree;
  
void InsertBST(BSTree &T,KeyType e)
{//当二叉排序树T不存在关键字等于e.key的数据元素时,插入该元素 
    BSTree S;
    if(T==NULL)
    {                          //找到插入位置,递归结束 
     S=new BSTNode;            //生成新节点*S 
     S->data =e ;               
     S->lchild =S->rchild =NULL;   //新节点作为叶子结点 
     T=S;                        //把新结点*S链接到已找到的插入位置    
    }
    else if(e <T->data ) InsertBST(T->lchild,e);
    else if(e >T->data ) InsertBST(T->rchild,e);
}
  
void CreateBST(BSTree &T)//BST的创建 
{
    KeyType e;
                       
    cin>>e;
    InsertBST(T,e);     
     
 } 
  
int SearchBST(BSTree T,KeyType key) //递归查找 
{
    if(!T) return 0; 
    else if(key==T->data )
    return 1;
    else if(key<T->data ) 
    return SearchBST(T->lchild ,key);
    else
    return SearchBST(T->rchild,key);
     
}
  
int main()
{
    unsigned int n,k;
    int m; 
    BSTree T;
    T=NULL;
    KeyType key;
    cin>>n>>k;
     
    for(int i=0;i<n;++i)
    {
        CreateBST(T);
    }
     
    for(int i=0;i<k;++i)
    {
         
        cin>>key;
        m=SearchBST(T,key);
        cout<<m<<" ";
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1905074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GraalVM上的多语言混合开发

上篇文件我们介绍了GraalVM强大的静态编译功能,能够让Java应用程序摆脱虚拟机的束缚,像其它本地编译的应用一样直接运行。那么GraalVM的神奇之处仅限于此吗?今天我们再来看看它的另一个重要特性—多语言混合开发 多语言平台 Java并不是唯一运行在JVM上的语言,这个我们都应…

Qt/C++音视频开发78-获取本地摄像头支持的分辨率/帧率/格式等信息/mjpeg/yuyv/h264

一、前言 上一篇文章讲到用ffmpeg命令方式执行打印到日志输出&#xff0c;可以拿到本地摄像头设备信息&#xff0c;顺藤摸瓜&#xff0c;发现可以通过执行 ffmpeg -f dshow -list_options true -i video“Webcam” 命令获取指定摄像头设备的分辨率帧率格式等信息&#xff0c;会…

ts-01.泛型(函数和接口)

泛型 泛的意思是:漂浮, 比如泛舟; 泛型: 类型漂浮未定 > 动态类型. 用于: 函数 接口 类 T extends string | number 泛型约束 function a<T any, K> (: number, value: T) { // 泛型参数设置默认值anyconst arr Array<T>(l).fill(value) // [foo, foo, foo] }…

IntelliJ IDEA菜单不见了设置找回方法

通过CtrAltS键按出设置 找到View,然后自定义一个快捷键,然后保存 使用自定义快捷键弹出改界面,点击Main Menu即可

树莓派4B_OpenCv学习笔记19:OpenCV舵机云台物体追踪

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; Python 版本3.7.3&#xff1a; ​​ 今日学习&#xff1…

# 三 JS的流程控制和函数

三 JS的流程控制和函数 3.1 JS分支结构 if结构 这里的if结构几乎和JAVA中的一样,需要注意的是 if()中的非空字符串会被认为是trueif()中的非零数字会被认为是true 代码 if(false){// 非空字符串 if判断为trueconsole.log(true) }else{console.log(false) } if(){// 长度为0…

Linux系统(Centos)下MySQL数据库中文乱码问题解决

问题描述&#xff1a;在进行数据库使用过程中&#xff0c;数据库里的数据中文都显示乱码。操作数据库的时候&#xff0c;会出现中文乱码问题。 解决方法如下&#xff1a; 第一步&#xff1a;打开虚拟机进入系统&#xff0c;启动MySQL。 第二步&#xff1a;连接登录MySQL输入…

排序 -- 万能测试oj

. - 力扣&#xff08;LeetCode&#xff09; 这道题我们可以使用我们学过的那些常见的排序方法来进行解答 //插入排序 void InsertSort(int* nums, int n) {for (int i 0; i < n-1; i){int end i;int tmp nums[end 1];while (end > 0){if (tmp < nums[end]){nums[…

GuitarPro2024音乐软件#创作神器#音乐梦想

嘿&#xff0c;亲爱的朋友们&#xff01;&#x1f44b;&#x1f44b;&#x1f44b;今天我要给你们安利一款超赞的软件——Guitar Pro。这款软件简直是吉他手的福音啊&#xff01;&#x1f389;&#x1f389;&#x1f389; Guitar Pro免费绿色永久安装包下载&#xff1a;&#…

数据结构(其一)--基础知识篇

1. 数据结构三要素 1.1 数据结构的运算 即&#xff0c;增删改查 1.2 数据结构的存储结构 2. 数据类型&#xff0c;抽象数据类型 数据类型&#xff1a; &#xff08;1&#xff09;. 原子类型&#xff1a;bool、int... &#xff08;2&#xff09;. 结构类型&#xff1a;类、…

赤壁之战的烽火台 - 观察者模式

“当烽火连三月&#xff0c;家书抵万金&#xff1b;设计模式得其法&#xff0c;千军如一心。” 在波澜壮阔的三国历史长河中&#xff0c;赤壁之战无疑是一场改变乾坤的重要战役。而在这场战役中&#xff0c;一个看似简单却至关重要的系统发挥了巨大作用——烽火台。这个古老的…

LeetCode 算法:二叉树中的最大路径和 c++

原题链接&#x1f517;&#xff1a;二叉树中的最大路径和 难度&#xff1a;困难⭐️⭐️⭐️ 题目 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;…

赋值运算符重载和const成员函数和 const函数

文章目录 1.运算符重载(1)(2)运算符重载的语法&#xff1a;(3)运算符重载的注意事项&#xff1a;(4)前置和后置重载区别 2.const成员函数3.取地址及const取地址操作符重载4.总结 1.运算符重载 (1) 我们知道内置类型(整形&#xff0c;字符型&#xff0c;浮点型…)可以进行一系…

ImportError: DLL load failed while importing _imaging: 操作系统无法运行 %1

解决方案&#xff1a; &#xff08;1&#xff09;搜索打开Anaconda Prompt控制台&#xff0c;进入到自己要安装的环境下面去&#xff0c;卸载Pillow:pip uninstall Pillow 没有安装Pillow的就不用卸载&#xff0c;直接安装&#xff0c; &#xff08;2&#xff09;然后再安装&a…

入门PHP就来我这(高级)13 ~ 图书添加功能

有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 今天给大家接着上篇文章编写图书添加功能。 1 添加页面 创建add.html页面样式&#xff0c;废…

实验2 Aprori关联挖掘算法

目 录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 3.1 connect_string()函数解析... 1 3.2 find_rule()函数解析纠错... 2 3.3 关联规则挖掘... 4 四、心得体会... 7 一、实验目的 &#xff08;1&#xff09;理解Aprori关联挖掘算法的程序编写&#xff1b; &…

《ClipCap》论文笔记(上)

原文出处 [2111.09734] ClipCap: CLIP Prefix for Image Captioning (arxiv.org) 原文笔记 What ClipCap&#xff1a; CLIP Prefix for Image Captioning 一言以蔽之&#xff1a;使用 CLIP 编码作为标题的前缀&#xff0c;使用简单的映射网络&#xff0c;然后微调语言模型…

EN-SLAM:Implicit Event-RGBD Neural SLAM解读

论文路径&#xff1a;https://arxiv.org/pdf/2311.11013.pdf 目录 1 论文背景 2 论文概述 2.1 神经辐射场&#xff08;NeRF&#xff09; 2.2 事件相机&#xff08;Event Camera&#xff09; 2.3 事件时间聚合优化策略&#xff08;ETA&#xff09; 2.4 可微分的CRF渲染技术…

Netty 启动源码阅读

文章目录 1. 入门2. Netty 代码实例3. Netty bind3.1 initAndRegister3.1.1 newChannel, 创建 NioServerSocketChannel3.1.2 init(channel); 初始化 NioServerSocketChannel3.1.3 register 注册channel 3.2 doBind0 绑定端口3.3 ServerBootstrapAcceptor 1. 入门 主从Reactor模…

不是哥们?你怎么抖成这样了?求你进来学学防抖吧!全方位深入剖析防抖的奥秘

前言 古有猴哥三打白骨精&#xff0c;白骨精 > 噶 今有用户疯狂点请求&#xff0c;服务器 > 噶 所以这防抖咱必须得学会&#xff01;&#xff01;&#xff01; 本文就来讲解一下Web前端中防抖的奥秘吧&#xff01;&#xff01;&#xff01;&#xff01; 为什么要做防…