数据结构学习总结--查找算法设计题


啊啊啊啊啊啊这一章真的是搞了好久啊 今天状态贼差 脑子疼痛 特别困和疲累
唉,该写的作业还得写该考的考试还得考 今天我想早点休息啊


(1)对 22 个记录的有序表作折半查找,当查找失败时,至少需要
比较( )次关键字。
A.3 B.4 C.5 D.6
答案:B
解释:22 个记录的有序表,其折半查找的判定树深度
为 5,且该判定树不是满二叉树,即查找失败时至多比
较 5 次,至少比较 4 次

`(2)试写出折半查 [算法描述]
   int BinSrch(rectype r[ ],int k,low,high)//在长为 n 的有序表中查找关键字 k,若查找成功,返回 k 所在位置,查找失败返回 0。
{
  if(low≤high) //low 和 high 分别是有序表的下界和上界
   {mid=(low+high)/2;
   if(r[mid].key==k)return (mid);
   else if(r[mid].key>k)return (BinSrch(r,k,mid+1,high));
   else return (BinSrch(r,k,low,mid-1));
   }
 else return (0);//查找失败。
   }//算法结束 `



`(3)试写一个判别给定二叉树是否为二叉排序树的算法
     #define true 1
     #define false 0
     typedef struct node
    {datatype data; struct node *lchild,*rchild;} *BTree;
     void JudgeBST(BTree T,int flag)
     // 判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag 得出结论。
     { if(T!=null && flag)
       { Judgebst(T->lchild,flag);// 中序遍历左子树
         if(pre==null)pre=T;// 中序遍历的第一个结点不必判断
            else if(pre->data<T->data)pre=T;//前驱指针指向当前结点
               else{flag=flase;} //不是完全二叉树
   Judgebst (T->rchild,flag);// 中序遍历右子树
     }//JudgeBST 算法结束    `

(4)已知二叉树 T 的结点形式为(lling,data,count,rlink),在
树中查找值为 X 的结点,若找到,则记数(count)加 1,否则,作
为一个新结点插入树中,插入后仍为二叉排序树,写出其非递归算
法。

  `void SearchBST(BiTree &T,int target){
     BiTree s,q,f; //以数据值 target,新建结点 s
     s=new BiTNode;
     s->data.x=target;
     s->data.count=0;
     s->lchild=s->rchild=NULL;
     if(!T){
        T=s;
        return ;
      } //如果该树为空则跳出该函数
  f=NULL;
  q=T;
  while (q){
     if (q->data.x==target){
        q->data.count++;
        return ;
  } //如果找到该值则计数加一
  f=q;
  if (q->data.x>target) //如果查找值比目标值大,则为
  该树左孩子
      q=q->lchild;
  else //否则为右孩子
      q=q->rchild;
  } //将新结点插入树中
  if(f->data.x>target)
     f->lchild=s;
  else
     f->rchild=s;
  }  `

(5)假设一棵平衡二叉树的每个结点都表明了平衡因子 b,试设计
一个算法,求平衡二叉树的高度

     `int Height(BSTree t)// 求平衡二叉树 t 的高度
       {level=0;p=t;
          while(p)
          {level++; // 树的高度增 1
          if(p->bf<0)p=p->rchild;//bf=-1 沿右分枝向下
             //bf 是平衡因子,是二叉树 t 结点的一个域
          else p=p->lchild; //bf>=0 沿左分枝向下
           }//while
       return (level);//平衡二叉树的高度
     } //算法结束  `

(6)分别写出在散列表中插入和删除关键字为 K 的一个记录的算
法,设散列函数为 H,解决冲突的方法为链地址法

    `bool insert(){
      int data;
      cin>>data;
      int ant=hash(data);
      LinkList p=HT[ant]; //初始化散列表
      while (p->next){
        if(p->next->data==data)
            return false; 
        p=p->next;
    } //找到插入位置
    LinkList s;
    s=new LNode;
    s->data=data;
    s->next=p->next;
    p->next=s; //插入该结点
    return true;
   }

   bool deletes(){
      int data;
      cin>>data;
      int ant=hash(data);
      LinkList p=HT[ant]; //初始化散列表
      while (p->next){
          if(p->next->data==data){
              LinkList s=p->next;
              p->next=s->next;
              delete s; //删除该结点
              return true;
      } //找到删除位置
      p=p->next; //遍历下一个结点
  }
  return false;}`


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM