杭電851資料結構歷年演算法設計題
阿新 • • 發佈:2020-11-18
杭電851資料結構
19年演算法設計題
- 求出指定結點在給定二叉排序樹中的層次
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; }
- 給定一個二叉樹和其中的一個結點。請找出中序遍歷順序中該結點的下一個結點並且返回。注意,樹中的結點。不僅包含左右子結點,同時包含指向父結點的指標。
//節點結構如下: 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; }
- 編寫演算法,實現在單向連結串列上刪除具有重複值的多餘節點,使得表中每個節點的數值均保持不同。
/* 以下程式碼是在有序單鏈表上刪除重複值, 無序的情況較複雜,不贅述。 */ /* 由於單鏈表有序,因此只需要依次遍歷相鄰兩個結點的值是否相同即可。 */ 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; } }
- 假設一個算數表示式中包括圓括號(),方括號[],和花括號{},編寫一個演算法來判別表示式中的括號是否配對,以字元\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;
}
}
- 請設計計演算法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;
}
}
-
在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); }