c语言数据结构学习心得——查找
顺序查找(线性查找)
主要用于在线性表中的查找
int Search1(int a[],int n,int key){
for(int i=;i<=n;i++){ //注意从1开始
if(a[i]==key)return i; //查找成功
}
return ; //查找失败
}
int Search2(int a[],int n,int key){
int i=n;
a[]=key; //设置“哨兵”
while(a[i]==key){ //若不是找的元素
i--; //从前往后查找
}
return i; //查找失败也返回0
}
折半查找
仅适用于有序的顺序表
算法思路:首先将给定值key与表中中间位置的元素的关键字比较,若相等,则查找成功,返回该元素的存储位置;若不等,则所需查找的元素只能在中间的元素以外的前半部分或后半部分中。然后在缩小的范围内继续进行同样的查找,如此重复知道找到为止,或者确定表中元素无所需的查找元素,则失效,返回失败信息。
分块查找(索引顺序查找)
1.确定待查找值在哪个块(折半查找)
2.在确定的块中查找待查找值(顺序查找)
二叉排序树(Binary Search Tree 二叉搜索树)
或是一棵空树,或是具有以下性质的二叉树
1.若左子树不空,则左子树上所有结点值均小于其根结点的值
2.若右子树不空,则右子树上所有结点值均小于其根结点的值
3.左右子树也是一棵二叉排序树
二叉排序树的目的不是为了排序,是为了提高查找(有序)和插入删除(树型结构)关键字的速度。
typedef struct BiTNode{ //二叉排序树结点结构
int data; //结点数据
struct BiTNode *lchild,*rchild; //指向该结点左右孩子的指针
}BiTNode,*BiTree
一.二叉排序树查找关键字代码
递归代码:
BiTNode *BST_Search(BiTNode *t,ElemType key){
if(t==NULL)return NULL; //若树为空则为空值
else{
if(t->key==key)return t;
else if(key<t->key)return BST_Search(t->lchild,key);
else if(key>t->key)return BST_Search(t->rchild,key);
}
}
非递归代码:
BiTNode *BST_Search(BiTNode *t,ElemType key){
BiTNode *p=t; //工作指针,初值指向二叉排序树根结点
while(p!=NULL&&key!=p->data){ //p不为空且没找到key
if(key<p->data) p=p->lchild; //若key值比p指向结点小,查左子树
else p=p->rchild; //若key值比p指向结点小,查右子树
return p; //成功返回p,失败返回NULL
}}
二叉排序树插入关键字代码:
1).空树:直接插入新结点返回成功
2).树不空:检查是否存在关键字重复的结点
(1)存在:返回插入失败
(2)不存在:检查根结点的值和待插入关键字值的大小关系递归插入左右子树中
int BST_Insert(BiTNode* &t,ElemType k){ //插入操作是要对树进行修改,所以是引用类型的指针
if(t==NULL){ //原树为空,新插入的记录为根结点
t=(BiTNode*)malloc(sizeof(BiTNode)); //malloc库函数分配新结点的存储空间
t->key=k; //该结点的关键值赋值给k
t->lchild=t->rchild=NULL; //该结点初始左右孩子为空
return ; //返回1,表示成功
}
else if(k==t->key) //树中存在相同关键字结点,失效
return ;
else if(k<t->key) //插入到t的左子树中
return BST_Insert(t->lchild,k);
else //插入到t的右子树中
return BST_Insert(t->rchild,k);
}
AVL平衡二叉树
特殊的二叉排序树,在于左右子树的高度差绝对值不超过1,且左右子树又是一棵平衡二叉树。
定义:结点左子树与右子树的高度差为该结点的平衡因子,则其只能是-1,0或1。
结论:假设Nh表示深度为h的平衡二叉树中含有的最少结点数,显然,N0=0,N1=1,N2=2,并且有Nh=Nh-1+Nh-2+1。
c语言数据结构学习心得——查找的更多相关文章
- c语言数据结构学习心得——图
图G由顶点集V和边集E组成,记为G=(V,E) 图不可为空,一定有顶点集不为空 有向图:有向边(弧)的有限集合 无向图:无向边的有限集合 连通:顶点V到顶点V'有路径 连通分量:无向图中的极大连通子图 ...
- c语言数据结构学习心得——排序
排序:将无序的序列重新排列为有序的序列. 插入类排序 插入类排序:在一个有序的序列中,插入一个新的关键字,知道所有的关键字都插入形成一个有序的序列. 直接插入排序:首先以一个元素为有序的序列,然后将后 ...
- c语言数据结构学习心得——二叉树
二叉树 n(n>=0)个结点的有限集合:(五种形态) 1.或者为空二叉树,n=0: 2.或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成.左子树和右子树又分别是一棵二叉树. 3.每个 ...
- c语言数据结构学习心得——树
树 一对多的树型结构,有且只有一个特定的根结点. 结点的度:结点拥有子树的数量{ 度为0:叶子结点/终端结点. 度不为0:非终端结点/分支结点(除去根结点其它称为内部结点).} 树的度:树中所有结点的 ...
- c语言数据结构学习心得——队列
队列 只允许在一端进行插入,在另一端进行删除的线性表 队头(Front):允许删除的一端(队首) 队尾(Rear):允许插入的一端 FIFO:先进先出 不要求从数组首位开始存储队列 #define M ...
- c语言数据结构学习心得——栈
栈(Stack) 只允许在一端进行插入或删除操作的线性表 栈顶(Top):栈中允许进行插入和删除操作的那一端: 栈底(Bottom):固定的,不允许进行插入或删除的另一端 1.栈是受限的线性表,所以自 ...
- c语言数据结构学习心得——线性表
线性表:具有相同数据类型的n(n>0)个数据元素的有限序列. 主要有顺序存储和链式存储. 顺序存储: 特点:地址连续,随机/存取,顺序存储. 建立:首地址/存储空间大小(数组),表长. 方式:静 ...
- c语言数据结构学习心得——数据结构基本概念
1.数据>数据元素>数据项 数据的基本单位是数据元素,数据元素的基本单位是数据项 2.运算的定义->针对逻辑结构 集合:同属于一个集合,无其他关系.(数学上的集合) 线性结 ...
- 获奖感言和C语言的学习心得
获奖感言和C语言的学习心得 自我介绍: 大家好,我的名字叫袁忠,我来自湖南,今年快19岁了,现在是大学一年级,我平时喜欢跑步.打羽毛球,我也喜欢学算法与数学,以及喜欢看一些与计算机有关的书籍,每次我学 ...
随机推荐
- 真是服了:.EndEdit(); 如果没哟这个一句(c#更新ACCESS,datagridview无法更新第一行)
//保存 this.jbbBindingSource3.EndEdit(); this.jbbTableAdapter3.Update(this.databaseDataSet3.jbb);
- leetcode784
这道题经过独立思考,通过使用二进制编码的方式来进行处理.分几个步骤一层一层的处理,最终解决了,这道题感觉应该属于medimu级别. public class Solution { /// <su ...
- 「小程序JAVA实战」 小程序手写属于自己的第一个demo(六)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-06/ 自己尝试的写一个小demo,用到自定义样式,自定义底部导航,页面之间的跳转等小功能.官方文档 ...
- Mycat实战之离散分片
1 枚举分片(customer表) #### 1.1 修改配置信息加载配置文件 datanode hash-int vi partition-hash-int.txt db1=0 db2=1 [roo ...
- iOS与HTML5交互方法总结(修正)
摘要 看了不少别人写的博客或者论坛,关于iOS与HTML5交互方法大概主要有5种方式: 1. 利用WKWebView进行交互(系统API) 2. 利用UIWebView进行交互(系统API) 3. 苹 ...
- 数字图像处理实验(11):PROJECT 05-02,Noise Reduction Using a Median Filter 标签: 图像处理MATLAB 2017-05-26 23:
实验要求: Objective: To understand the non-linearity of median filtering and its noise suppressing abili ...
- 使用Sqlserver事务发布实现数据同步(转)
出处:http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html 事务的功能在sqlserver中由来已久,因为最近在做一个数据同步方案 ...
- Maven整理笔记の初步窥探
第一部分:引言 Maven是一款跨平台的项目管理工具,作为Apache组织的一个开源项目,主要服务于基于java平台的项目构建.依赖管理和项目信息管理. 项目构建:编译.运行单元测试.生成文档.打包和 ...
- 转 Delphi中XLSReadWrite控件的使用(2)---基本应用
unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...
- LeftStr函数使用
LeftStr(s, i); 表示返回字符串s的左边共I位字符的一个新字符串. var i: integer; s: string; result: string; begin i := ; s := ...