數據結構學習總結--查找算法設計題


啊啊啊啊啊啊這一章真的是搞了好久啊 今天狀態賊差 腦子疼痛 特別困和疲累
唉,該寫的作業還得寫該考的考試還得考 今天我想早點休息啊


(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