1.顺序查找,折半查找,二叉排序树操作定义

SeqSearch.h

#include<stdio.h>
#define ARRAYLEN 8int source[]={69, 65, 90, 37, 92, 6, 28, 54};        //静态查找表
int source1[ARRAYLEN + 1]={69, 65, 90, 37, 92, 6, 28, 54};        //改进顺序查找算法使用的静态查找表
int source2[]={6, 12, 28, 37, 54, 65, 69, 83};                 //折半查找算法使用的静态查找表
//int source3[12]={54, 90, 6, 69, 12, 37, 92, 28, 65, 83, 91, 94};
int source3[2]={92, 12};/*******************顺序查找start*********************/
/*优点:对静态查找表数据顺序没有要求;若需创建动态查找表,可方便地将查找不成功数据添加到表的末尾缺点:速度慢,复杂度为O(n)
*/
//功能:顺序查找
int SeqSearch(int s[], int n, int key){int i;for(i=0; i<n && s[i]!=key; i++) //循环查找关键字;if(i<n)return i;elsereturn -1;
}//功能:改进的顺序查找方法(在创建静态查找表时,在该表的末端增加一个空的单元,用来保存查找的关键字;保证查找表中总能找到关键字)
int SeqSearch1(int s[], int n, int key){int i;for(i=0; s[i]!=key; i++)      //减少比较次数;if(i<n)return i;elsereturn -1;
}/*******************顺序查找end*********************//*******************折半查找start*********************/
/*优点:查找速度快O(nlogn)缺点:1)静态查找表必须是有序的,2)将查找不成功关键字数据添加到查找表中,需要大量的移动操作
*/
//功能:顺序查找
int BinarySearch(int s[], int n, int key){int left, mid, right;left = 0;right = n-1;while(left <= right){mid = (left + right)/2;if(s[mid] == key)return mid;else if(s[mid] > key)right = mid - 1;elseleft = mid + 1;}return -1;
}/*******************折半查找end*********************//*******************二叉排序树查找start*********************/
/*优点:查找速度快O(nlogn)缺点:1)静态查找表必须是有序的,2)将查找不成功关键字数据添加到查找表中,需要大量的移动操作
*/
//功能:定义二叉树结构
typedef struct bst{int data;struct bst *left;struct bst *right;
}BSTree;//功能:在二叉排序树中插入关键字key,插入后一定是一个叶子节点
//假设不会出现相同的数据
void InsertBSTree(BSTree *bt, int key){BSTree *p, *head, *parent;if(!(p=(BSTree *)malloc(sizeof(BSTree)))){printf("申请内存出错!\n");exit(0);}//初始化申请的内存空间p->data = key;p->left = NULL;p->right = NULL;//查找需要添加的父节点head = bt;while(head){parent = head;  //退出循环时head==NULL,所以用parent,指向前一个节点if(head->data > key)head = head->left;elsehead = head->right;}//判断添加到左子树还是右子树上if(key < parent->data)parent->left = p;else parent->right = p;
}//功能:创建二叉排序树
void CreateBST(BSTree *t, int data[], int n){int i;t->data = data[0];               //初始化根节点t->left = t->right = NULL;for(i=1; i<n; i++)InsertBSTree(t, data[i]);
}//功能:中序遍历二叉排序树
void BST_LDR(BSTree *t){if(t){BST_LDR(t->left);printf("%d ", t->data);BST_LDR(t->right);}
}//功能:二叉排序树的查找
BSTree *searchBST(BSTree *t, int key){if(!t || t->data == key)return t;else if(t->data > key)return (searchBST(t->left, key));elsereturn (searchBST(t->right, key));
}//功能:删除二叉排序树中的节点
void BST_Delete(BSTree *t, int key){BSTree *p, *parent, *ll, *l;int child=0;   //0表示左子树,1表示右子树int flag = 1;if(!t)      //二叉排序树为空return;p = t;parent = p;while(flag){//p节点数据等于关键字if(p->data == key){//p节点为叶节点(左右子树均为空)if(!p->left && !p->right){if(p==t)           //被删除的是根节点free(p);else if(child==0){parent->left = NULL;free(p);}else{parent->right = NULL;free(p);}p = NULL;flag = 0;}//p节点左子树为空,右子树不空else if(!p->left){if(child==0)parent->left = p->right;elseparent->right = p->right;free(p);p = NULL;flag = 0;}//p节点右子树为空,左子树不空else if(!p->right){if(child==0)parent->left = p->left;elseparent->right = p->left;free(p);p = NULL;flag = 0;}//p节点为分支节点(左右子树均不空)else{ll=p;l=p->right;if(l->left){while(l->left){ll = l;l = l->left;}p->data = l->data;ll->left = NULL;}else{p->data = l->data;p->right = l->right;}free(l);flag = 0;}}//p节点数据大于关键字else if(p->data > key){child = 0;parent = p;p = p->left;}//p节点数据小于关键字else{child = 1;parent = p;p = p->right;}}
}
/*******************二叉排序树查找end*********************/

2. 测试查找操作

BSTreeTest.cpp

#include<stdio.h>
#include<stdlib.h>#include"SeqSearch.h"int main(){int key, i, pos;BSTree bst, *pos1;int select;int data;do{printf("---------------------------\n");printf("1.顺序查找算法           2.改进后的顺序查找算法\n");printf("3.折半查找算法           4.创建二叉排序树\n");printf("5.遍历二叉排序树         6.二叉排序树查找算法\n");printf("7.删除二叉排序树的某个节点\n");printf("0.退出\n");printf("请选择执行的操作序号:");//select = getch();fflush(stdin);scanf("%d", &select);switch(select){case 1:printf("请输入查找关键字:");fflush(stdin);scanf("%d", &key);//调用顺序查找算法pos = SeqSearch(source, ARRAYLEN, key);if(pos>=0)printf("查找成功,该关键字位于数组的第%d个位置。\n", pos+1);elseprintf("查找失败。\n");break;case 2:printf("请输入查找关键字:");fflush(stdin);scanf("%d", &key);source1[ARRAYLEN]=key;       //将查找关键字放入最后一个位置//调用改进后的顺序查找算法pos = SeqSearch1(source1, ARRAYLEN, key);if(pos>=0)printf("查找成功,该关键字位于数组的第%d个位置。\n", pos+1);elseprintf("查找失败。\n");break;case 3:printf("请输入查找关键字:");fflush(stdin);scanf("%d", &key);//调用折半查找算法pos = BinarySearch(source1, ARRAYLEN, key);if(pos>=0)printf("查找成功,该关键字位于数组的第%d个位置。\n", pos+1);elseprintf("查找失败。\n");break;case 4:CreateBST(&bst, source3, 2);       //创建二叉排序树break;case 5:printf("二叉排序树遍历结果:");BST_LDR(&bst);                  //遍历二叉排序树printf("\n");break;case 6:printf("请输入查找关键字:");fflush(stdin);scanf("%d", &key);pos1 = searchBST(&bst, key);printf("原数据为:");for(i=0; i<2; i++)printf("%d ", source3[i]);printf("\n");if(pos1)printf("查找成功,该节点的地址为:%x\n", pos1);elseprintf("查找失败。\n");break;case 7:printf("请输入要删除的关键字:");fflush(stdin);scanf("%d", &key);BST_Delete(&bst, key);break;}}while(select != 0);system("pause");return 0;
}

顺序查找 折半查找 二叉排序树相关推荐

  1. 顺序表查找+折半查找(二级)

    我们讲了各种数据 结构之后,比如讲了线性表了,讲了栈和队列,讲了树和二叉树,讲了图之后呢,我们最后还有两个专题,一个叫查找,一个叫排序,我们先看看查找,查找包括哪些内容啊,第一个线性表的查找,数组或者 ...

  2. c语言折半查找输出坐标,数据结构(C语言版)——有序表查找(折半查找)(代码版)...

    数据结构(C语言版)--有序表查找(折半查找)(代码版) 数据结构(C语言版)--有序表查找(折半查找)(代码版) #include #include #define ERROR 0 #define ...

  3. 二分查找/折半查找算法

    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表 ...

  4. Python二分查找/折半查找算法详解--(面试常考)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究)   二分查找也称折 ...

  5. C语言数组查找(线性查找 折半查找)

    线性查找 #include <stdio.h> #include <math.h>void find_nine(int numbers[]) {int i;for(i = 0; ...

  6. swift版 二分查找 (折半查找)

    二分查找作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围之内,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找.废话少说,直接上代码,可复制粘贴直接出结果! import ...

  7. php折半查找算法,二分查找 [折半查找] 算法 PHP 版

    查找表:就是同一类型的数据元素构成的数据集合 有静态表和动态表 本文实现PHP版的二分查找算法[本算法仅用于顺序存储的查找表] /** * Created by PhpStorm. * User: 1 ...

  8. DS查找—折半查找求阶乘函数后K个零

    题目描述 f(x) 是 x! 末尾是 0 的数量,给定 K,找出多少个非负整数 x ,能满足 f(x) = K . (x! = 1 * 2 * 3 * - * x,且 0! = 1 ) 例如, f(3 ...

  9. 数据结构之查找-顺序查找,折半查找,分块查找

    文章目录 一.顺序查找 1.1 无序表的顺序查找 1.2 有序表的顺序查找 二.折半查找 三.分块查找 一.顺序查找 顺序查找又称线性查找,主要用于在线性表中进行查找. 1.1 无序表的顺序查找 对无 ...

最新文章

  1. PHP-CGI, FastCGI, PHP-FPM的关系和区别
  2. 艾伟_转载:使用LINQ to SQL更新数据库(中):几种解决方案
  3. Ethercat解析(八)之主站运行阶段
  4. RecycleView实现多布局可展开列表
  5. C++进阶教程之模板
  6. FreeRTOS的HOOK,以及(23)FreeRTOS 空闲任务分析
  7. linux命令行经典教程,linux常用命令的经典使用
  8. c语言入门教程怎么编程,从零开始的C语言入门教程-编程语言的基础
  9. php复姓怎么排序,按姓氏笔画排名怎么排列了
  10. 简单了解一下电商系统中的SPU、SKU、ID,它们都是什么意思,三者又有什么区别和联系呢?
  11. Glide源码分析以及三级缓存原理
  12. 「 神器 」极简网速监控悬浮窗软件
  13. 【applicationContext.xml】spring 配置文件头部声明
  14. 淡季累库,黑色短期高位震荡看待(20210104).PDF
  15. Python迷宫生成器
  16. IPv6连接测试通过,但是无法ping成功问题解决(记录)
  17. math.random()函数用法
  18. win10下如何配置JAVA环境
  19. create table进阶学习(四)
  20. 海鸥算法的改进及其在工程设计优化问题中的应用

热门文章

  1. STM32G431控制窗帘电机-窗帘电机拆机
  2. 供应商网店货源哪里找?直播带货靠谱货源(电商教程)
  3. js封装QQ音乐api
  4. 在计算机上配置dns,常见设备和系统上配置DNS的方法DNS服务器 -电脑资料
  5. Python 罗德里格矩阵的空间坐标转换——两组公共点求所属坐标系的旋转矩阵与平移矩阵
  6. 【Python爬虫案例】批量采集网站壁纸,实现自动更换桌面壁纸
  7. 安徽赛区-云巡未来-第十一届全国大学生电子商务“创新、创意及创业”挑战赛 赛后总结
  8. python 浏览器 弹 另存为_另存为弹出框如何调用
  9. IPA 包不经过APP Store直接发布到网站供用户下载安装
  10. android多媒体视频,android多媒体(视频播放器)