一、填空
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->data
三、算法:
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