Fork me on GitHub

c语言数据结构学习心得——查找

顺序查找(线性查找)

主要用于在线性表中的查找

int Search1(int a[],int n,int key){
   for(int i=1;i<=n;i++){             //注意从1开始
      if(a[i]==key)return i;          //查找成功
   }
   return 0;                          //查找失败
}
int Search2(int a[],int n,int key){
   int i=n;
   a[0]=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;                                    //返回1,表示成功
   }
   else if(k==t->key)                             //树中存在相同关键字结点,失效
     return 0;
   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。

 

posted @ 2019-03-28 23:01  一个阳  阅读(954)  评论(0编辑  收藏  举报