数据结构考试要点

一、填空

1、完全二叉树:2^(h-1)<=结点数量<= 2^h -1 (h<=(log2^ n+1)) a、二叉树:第i层至多有2^(i-1)个结点;结点数量<= 2^h -1;n0=n2 +1 ; 完全二叉树最下面一层的最左子树开始计算,如果出现偶数个结点则不存在度为1的结点,反之度为1的结点个数一定是1(或总结点数为偶)    2、单链判空:head->next==NULL; 循环单空:head->next==head;循环双:L->next==L或者L->prior==L  3、哈夫曼树没有度为1的节点 二叉树的性质:度为0的结点个数比度为2的多一个  4、数组data[m]作为循环队列SQ的存储空间,队尾指针是rear,队头是front,QueueSize(m)为循环队列的最大长度;队空条件:rear==front ;队满条件:(rear+1) %QueueSIze==front ;计算队列长度:(rear-front+QueueSize)%QueueSize 入队:(rear+1)%QueueSize   出队:(front+1)%QueueSize

模式串   ab a a b c a c  next值   0 1 1 2 2 3 1 2同加1,不同即为1  nextval   0 1 0 2 1 3 02同0,不同为next  3、冒泡排序 O(N2) 选择排序 O(N2) 插入排序 O(N2) 希尔排序 O(NlogN) 快速排序 O(NlogN) 归并排序 O(NlogN) 二叉树排序 O(NlogN) 堆排序 O(NlogN) 拓扑排序 O(N+E)        Q,H,C,Y,Q,A,M,S, R,D,F,X shell: Q,A,C,S,Q,D,F,X,R,H,M,Y 对吧? 快排:MACD,FHQX,RSQY          排序题:快排:C, pivot = 46   [],79,56,38,40,84;40,79,56,38,[],84  //从后往前扫找到40比46小,交换;40,[],56,38,79,84  //从前往后扫找到79比46大,交换;40,38,56,[],79,84  //从后往前扫找到38比46小,交换     40,38,[],56,79,84  //从前往后扫找到56比46大,40,38,46,56,79,84  //最后插入基准46        希尔:16 25  12  30 47  11  23 36  9  18 31   ( 11 23 12  9   18 16 25 36 30  47 31)(9 18  12  11 23 16 25 31 30 47 36)(9 11 12 16  18 23  25 30 31 36 47)        归并:[49] [38] [65] [97] [76] [13] [27] (s=1,t=7)>>[49  38] [65  97] [76 13]  [27]>> [ 38  49] [65 97] [13  76]  [27]>> [ 38   49  65   97] [13   27  76]>> [ 13   27   38  49   65   76  97]

二、程序题

1、对带头结点的单链表L就地逆置:p!=null;L->next;p=s (POQ->RPSOQ)2、返回二叉树中的=值x所在的层次:c1+1; nodelevel(bt->rightchild,x);c2+1   3、将俩个有序的链表归并为一个有序TR[K]=SR[j++];TR[K..n]=SR[i…m];(s+t)/2;MSort(SR,TR2,m+1,t) 4、删除并回收带头结点的单链表:L->next=p->next;free(p); p=L->next   5、对子序列进行快排:r[i].key<=x.key;r[j]=r[i];r[i]=x 6、将结点x插入到二叉排序树中:T==NULL;P->left=null;return f6(t->right,x)  7、函数GetElem实现返回单链表的第i个元素:p=p->next;p->data

8、以域变量rear和length分别指示循环队列入队列算法。Q.length == MAXQSIZE ++Q.rear  ++Q.length  9、单链表  函数Selectsort 无头结点 简单选择排序:(1)!=null (2)p->next (3)r!=null(4)r->datadata (5)r->next (6)p->next 10、排序【a.题中p指向无序区第一个记录,q指向最小值结点,一趟排序结束,p和q所指结点值交换,同时向后移p指针。(1)!=null       (2)p->next(3)r!=null (4)r->datadata(5)r->next (6)p->next  b. 题中为操作方便,先增加头结点(最后删除),p指向无序区的前一记录,r指向最小值结点的前驱,一趟排序结束,无序区第一个记录与r所指结点的后继交换指针。  (1)q->link!=NULL(2)r!=p   (3)p->link(4)p->link=s      (5)p=p->link   c.(1)ir[n-i+1] 】

三、算法:

1、删除表中所有值相同的多余元素:void Purge(LinkList &L) { ElemTypelast=L->next->data; LinkList q=L->next,p=L->next; while(p){if(last==p->data&&p!=L->next){ q->next=p->next; free(p);p=q; } else {last=p->data;} q=p; p=p->next; } }   2、对单链表实现就地逆置:void Inverse(LinkList &L) /* 对带头结点的单链表L实现就地逆置 */ { LinkList last,cur,q; q=L->next; //保存首元素地址 last=L->next;//上一个指针 cur=L->next; //当前操作的指针 if(cur){ while(cur){//此处没注意,写成了!cur,大意失荆州啊! cur=L->next; L->next=cur->next;cur->next=last; if(cur){last=cur;} } L->next=last; q->next=NULL; } }   3、判别读入的一个以’@'为结束符的字符序列是否是”回文”:Status Palindrome(char *word) { Stack S; char temp;InitStack(S); char *p=word,*q=word; while(*p!='@'){ Push(S,*p); ++p; }while(!StackEmpty(S)){ Pop(S,temp); if(temp!=*q){ break; } ++q; }if(StackEmpty(S)){ return TRUE; } return FALSE; }   4、判别给定两棵二叉树是否相似:Status Similar(BiTree t1, BiTree t2) {if(!t1&&!t2){//return TRUE; } else if(t1&&t2){// returnSimilar(t1->lchild,t2->lchild)&&Similar(t1->rchild,t2->rchild);} else{// return FALSE; } }   5、用栈的基本操作写出先序遍历的非递归形式的算法:if(bt){//判断树空 SElemType p=bt; Stack S; InitStack(S); while(!StackEmpty(S)||p){while(p){ visit(p->data); Push(S,p); p=p->lchild; } if(!StackEmpty(S)){Pop(S,p); p=p->rchild; } } } }

6、递归算法,计算二叉树中叶子结点的数目:void Leaves(BiTree bt, int &x) { intl1,l2; if(bt){ if(!bt->lchild&&!bt->rchild){ ++x; } else{Leaves(bt->lchild,x); Leaves(bt->rchild,x); } } }

7、递归算法,将二叉树中所有结点的左、右子树相互交换:void Exchange(BiTree &bt) { BiTreetemp; if(bt){ Exchange(bt->lchild); Exchange(bt->rchild);temp=bt->lchild; bt->lchild=bt->rchild; bt->rchild=temp; } }  8、按层次顺序(同一层自左至右)遍历二叉树的算法:void LevelOrder(BiTree bt, char *ss) { int i=0; QueueQ; BiTree p; InitQueue(Q); if(bt){ EnQueue(Q,bt); while(!QueueEmpty(Q)){DeQueue(Q,p); ss[i++]=p->data; if(p->lchild){ EnQueue(Q,p->lchild); }if(p->rchild){ EnQueue(Q,p->rchild); } } ss[i]='\0'; } 

9.44 voidPrintKeys0944(HashTable ht, void(*print)(StrKeyType)) /* 依题意用print输出关键字 */ { int i,j; for (i=0; i<26; i++) {j=i%hashsize[ht.sizeindex]; while (strlen(ht.elem[j].key)!=0) { if(hash(ht.elem[j].key)==i) print(ht.elem[j].key);j=(j+1)%hashsize[ht.sizeindex]; } } } 9.31 Status BSTree(BiTree t, BiTree&pre); Status IsBSTree(BiTree t) /* 判别给定二叉树t是否为二叉排序树。*/ /* 若是,则返回TRUE,否则FALSE */ { BiTree p=NULL; return BSTree(t, p); } Status BSTree(BiTreet, BiTree &pre) { if(t==NULL) return TRUE; if (!BSTree(t->lchild, pre))return FALSE; if(pre!=NULL && pre->data.key>t->data.key)return FALSE; pre=t; return BSTree(t->rchild, pre); 9.26 intBinSearch0926(SSTable s, int low, int high, KeyType k) /* Index the elementwhich key is k */ /* in StaticSearchTable s. */ /* Return 0 if x is not found.*/ { int mid; if (low>high) return 0; mid=(low+high)/2; if (k==s.elem[mid].key)return mid; if (k>s.elem[mid].key) return BinSearch0926(s,mid+1,high,k);else return BinSearch0926(s,low,mid-1,k); }

9.25 intSearch0925(SSTable a, KeyType k) /* Index the element which key is k */ /* inStaticSearchTable s. */ /* Return 0 if x is not found. */ { int i;a.elem[a.length+1].key=k; for (i=1; a.elem[i].key>k; i++); if(i<=a.length && a.elem[i].key==k) return i; else return 0; } 10.43void CountSort1043(SqList &L) /* 采用顺序表存储结构,L.r存储序列a,L.length为n */ /* 在函数内自行定义计数数组c */ { int c[MAXSIZE+1],i,j,x; RedType rc; for (i=1;i<=L.length; i++) c[i]=1; for (i=1; i<=L.length; i++) for (j=i+1;j<=L.length; j++) if (L.r[i].key" */ /* void Swap(RedType&a, RedType &b); 交换 */ { int lastChange=L.length; int change,i,j; for (i=L.length; i>1&& lastChange!=0; i--) { change=0; for (j=1; j=1; k--) { if (L.r[k].key>L.r[k+1].key) { L.r[n]=L.r[k];for (i=k+1; L.r[i].key

数据结构考试要点_第1张图片

 

你可能感兴趣的:(数据结构)