1. 程式人生 > 實用技巧 >杭電851資料結構歷年演算法設計題

杭電851資料結構歷年演算法設計題

杭電851資料結構

19年演算法設計題

  1. 求出指定結點在給定二叉排序樹中的層次
   int findLevel(BiTree T,int x){
       int level = 0;
       BiTree bt;
       bt = T;
       while(bt!=NULL){
           n++;
           while(bt->data != data){
               if(bt->data <x)
                   bt = bt->rlchild;
               else
                   bt = bt->lchild;
               n++;
           }
       }
       return n;
   }
  1. 給定一個二叉樹和其中的一個結點。請找出中序遍歷順序中該結點的下一個結點並且返回。注意,樹中的結點。不僅包含左右子結點,同時包含指向父結點的指標。
   //節點結構如下:
   struct TreeLinkNode{
       int val;
       struct TreeLinkNode *left;
       struct TreeLinkNode *right;
       struct TreeLinkNode *next;
       TreeLinkNode(int x):val(int x),left(NULL),right(NULL),next(NULL){}
   };
   /*
   演算法思想:
    題目要求查詢某結點的中序序列的後繼,可分為以下兩種情況:
    ① 當該結點有右孩子時,則其後繼結點就是其右孩子分支上的最左邊的結點;
    ② 當該結點沒有右孩子時,此時又分為兩種情況:
     	a.如果該結點是父結點的左子結點,則其後繼結點就是其父結點。
	b.如果該結點是父結點的右子結點,則需要不斷往上找其父親結點,
	直到找到一個滿足這樣條件的結點——該結點父結點的右孩子不再是其自身,
	換句話就是該結點是其父結點的左孩子時,那麼後繼結點就是這個父親結點。
   */
   //程式碼如下
   TreeLinkNode* GetNext(TreeLinkNode* pNode){
       TreeLinkNode bt = pNode;
       //第一種情況
       if(bt->right!=NULL){
            bt = bt->right;
           while(bt->left!=NULL)
               bt = bt->left;
           return bt;
       }
       
       //第二種情況的a
       if(bt->next!=NULL && bt->next.left == bt)
       {
           return bt->next;
       }
       
        //第二種情況的b
       if(bt->next != NULL){
           while(bt->next != NULL && bt->next->riht == bt)
               bt = bt->next;
       }
       return bt->next;
   }
  1. 編寫演算法,實現在單向連結串列上刪除具有重複值的多餘節點,使得表中每個節點的數值均保持不同。
   /*
   以下程式碼是在有序單鏈表上刪除重複值,
   無序的情況較複雜,不贅述。
   */
   
   /*
   由於單鏈表有序,因此只需要依次遍歷相鄰兩個結點的值是否相同即可。
   */
   void Del_Same(LinkList &L){
       LNode *p = L->next;
       LNode *q;
       if(p==NULL)
           return;
       while(p->next!=NULL){
           q = p->next;
           if(p->next==q->next){
               free(q);
           }
           else
               p = p->next;
       }
   }
  1. 假設一個算數表示式中包括圓括號(),方括號[],和花括號{},編寫一個演算法來判別表示式中的括號是否配對,以字元\0'作為算數表示式的結束符。
   //此處只給出匹配圓括號()時的程式碼,
   //方括號[],和花括號{}同理
   
   bool Match(char *str){
       int i=0,flag=0;
       InitStack(S);
       char e;
       while(str[i]!='\0'){
           switch(str[i]){
               case '(':
                   Push(S,str[i]);
               	break;
               case ')':{
                   Pop(S,&e);
                   if(e!='(')
                       flag =1;
               	}
              		break;
   			default:
                  	break;
           }//switch結束
           if(flag)
               break;
           i++
       }//while結束
       if(!flag && StackEmpty(S)){
           printf("匹配成功");
           return true;
       }
       else{
   		printf("匹配失敗");
           return false;
       }
   }
  1. 請設計計演算法MatToList,將無向圖的鄰接矩陣轉為對應的鄰接表。
//已知圖的鄰接矩陣的儲存結構說明為:
Typedef Sturct{
  int vertex[m];
  int edge[m];
}gadmatrix;

//圖的鄰接表的儲存結構說明為:
Typedef Sturct node1{
  int info;
  int adjvertex;
  struct node1 *nextarc;
}glinklistnode;

Typedef Sturct node2{
  int vertexinto;
  glinklistnode *firstarc;
}glinkheadnode;

//以下為程式碼
void MatToList(gadjmatrix g1[],glinkheadnode g2[]){
  int i,j,glinklistnode *p;
  for(i=0;i<n;i++)
      g2[i].firstarc =0;
  for(i=0;i<n;i++)  
      for(j=0;j<n;i++)
          if(g1.edge[i][j]==1){
              p = (glinklistnode*)malloc(sizeof(glinklistnode));
              p->adjvertex = j;
              p->nextarc = g1[i].firstarc;
              g1[i].firstarc =p;
              
              p = (glinklistnode*)malloc(sizeof(glinklistnode));
              p->adjvertex = i;
              p->nextarc = g1[j].firstarc;
              g1[j].firstarc =p;
          }
}
  1. 在n個元素中,找出第k大的元素,用C語言寫出資料結構,設計演算法實現上述要求,並分析時間複雜性,最好是平均時間複雜性為O(n)。

    int Kth_elem(int a[],int low.int high,int k){
        int key = a[low];
     int low_temp = low;
        int high_temp = high; 
        //經典的快排模板
        while(low<high){
            while(low<high && a[high]>=key)
                high--;
            a[low] = a[high];
            while(low<high && a[low]<=key)
                low++;
            a[high] = a[low];
        }
        a[low] = key;
        if(low == k)
            return a[low];
        else if(low >k)
            return Kth_elem(a,low_temp.low-1,k);
        else
            return Kth_elem(a,low+1,high_temp,k-low);
    }