查找(顺序查找、折半查找和二叉排序树的查找与插入)

查找

一、静态查找(Static Search Table)

顺序查找的存储结构

typedef struct {
	int key; //关键字
}ElemType;

typedef struct {
	ElemType *elem; //数据元素存储空间基址 
	int length; //表长度 

顺序查找(Sequential Search)

//顺序查找
int Search_Seq(SSTable ST, int key) 
{//在顺序表ST中顺序查找其关键字等于key的元素,若找到,怎函数值为该元素在表中的位置,否则为0 
	ST.elem[0].key = key;
	//起到监视哨的作用,目的在于免去查找过程中每一步都要检测整个表是否查找完毕 
	int i;
	for(i = ST.length; ST.elem[i].key != key; i-- );
			return i;
}

折半查找(Binary Search)

算法思想:

  1. 先确定待查记录的范围。
  2. 给定的值与中间记录进行比较
    若相等,则找到, 返回位置。
    若不相等,则缩小范围在前半部分或后半部分。
  3. 重复2,直到找到或不存在范围找不到结束。
//折半查找
int Search_Bin(SSTable ST, int key)
{//关键字有序
	int min, max, mid;
	min = 1;
	max = ST.length;
	while(min <= max)
	{
		mid = (min + max)/2;
		if(ST.elem[mid].key == key)
			return mid;
		else if(ST.elem[mid].key > key)
			max = mid - 1;
		else
			min = mid + 1;
	}
	return 0;
}

二、动态查找(Dynamic Search Table)

动态查找表的特点:

  • 表结构本身是在查找过程中动态生成的。即对给定值key, 若表中有其关键字等于key的记录,则查找成功返回,否则插入关
    键字等于key的记录。

二叉排序树(Binary Sort Tree)

什么是二叉排序树?(二叉查找树)
或者是一棵空树,或者是具有下面性质的二叉树:

  1. 若它的左子树不空,则左子树上所有结点的值均小于它的根的值;
  2. 若它的右子树不空,则右子树上所有结点的值均大于它的根的值;
  3. 它的左、右子树也分别是二叉排序树。
//二叉排序树
BiTree SearchBST(BiTree T,int key)
{//查找成功,返回指向该数据元素结点的指针,否则返回空指针 
	//小于关键字在左子树中继续查找,大于关键字在右子树中继续查找
	if(!T || T->key == key)
		return T; //查找结束 
	else if(T->key > key)
		return SearchBST(T->lchild,key);
	else
		return SearchBST(T->rchild,key);
}

二叉排序树的插入

二叉排序树是一种动态树表。其特点是:

  1. 树的结构通常不是一次生成的,而是在查找的过程中,当 不存在关键字等于给定值的结点时在进行插入。
  2. 新插入的结点一定是叶子,并且是查找不成功时查找路径 上最后一个结点的左子女或右子女。
//插入操作
int SearchBST(BiTree T, int key, BiTree &p)
{//查找成功,指针p指向该数据元素结点,并返回1;
//查找不成功,指针p指向查找路径上访问的最后一个结点,并返回0。 
	if(!T)
		return 0; //查找不成功
	else if(T->key == key)
	{
		p = T;
		return 1; //查找成功 
	} 
		
	else if(T->key > key)
	{
		p = T;
		return SearchBST(T->lchild,key, p);
	}
	else
	{
		p = T;
		return SearchBST(T->rchild,key, p);
	}
}

int InsertBST(BiTree &T, int key)
{//当二叉排序树T中不存在关键字等于key的元素时,插入key并返回1,否则返回0 
	
	BiTree p, q;
	p = NULL;
	if(SearchBST(T,key,p) == 1)
		return 0;

	q = (BiTree)malloc(sizeof(BTree));
	q->key = key;
	q->lchild = NULL;
	q->rchild = NULL;
	if(p == NULL)
		T = q;
	else if(p->key > key)
		p->lchild = q;
	else
		p->rchild = q;
	return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值