zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    JS中的call()和apply()方法
    小鲜肉初学JS做得仿京东淘宝竖排二级导航
    OnClientClick="return confirm('确定要删除吗?')"
    sql主键的一点重要理解
    形态学对象的提取与屏蔽 (开操作和闭操作)
    水平竖直线及矩形方式提取结构
    形态学图像的膨胀与腐蚀
    自定义卷积核
    直线、矩形、圆、椭圆、文字等绘制
    霍夫变换圆形检测
  • 原文地址:https://www.cnblogs.com/suprechen/p/10618446.html
Copyright © 2011-2022 走看看