王道数据结构
2020王道数据结构部分题目
Hillbox
这个作者很懒,什么都没留下…
展开
-
王道数据结构4.4.5——7、已知一棵有2011个结点的树,其叶结点个数为116,该树对应的二叉树中无右孩子的结点个数是?
原创 2019-10-28 00:12:03 · 15263 阅读 · 29 评论 -
王道数据结构4.3.3大题
1、高度=结点数2、只有一个根结点3、后序遍历的非递归算法void posorder(BTNode *bt){ if(bt!=NULL){ BTNode *Stack1[maxSize];int top1=-1; BTNode *Stack2[maxSize];int top2=-1; Stack1[++top1]=bt; ...原创 2019-10-27 20:37:18 · 529 阅读 · 2 评论 -
王道数据结构4.4.5大题
4、正则k叉树有m个非叶结点,则叶结点有多少?若正则k叉树高为h,则结点数最多为多少?最少为多少?5、以孩子兄弟表示法存储的森林的叶子结点树即求二叉树中左孩子为空的结点的个数6、以孩子兄弟链表为存储结构,设计递归算法求树的深度7、已知一棵树的层次序列及每个结点的度,编写算法构造此树的孩子兄弟链表...原创 2019-10-28 03:20:26 · 591 阅读 · 0 评论 -
王道数据结构3.3.6——3、利用栈实现以下递归函数的非递归算法
思路代码double p(int n,double x){ struct stack{ int no; double val; }st[MaxSize]; int top=-1,i; double fv1=1,fv2=2*x; for(i=n;i>=2;i--){ //入栈 top++;...原创 2019-10-14 02:42:28 · 1130 阅读 · 0 评论 -
王道数据结构3.3.6——2、铁道进行车厢调度,将一辆列车的硬座车厢都调到软坐车厢后面
思路给定火车字符数组,将硬座字符放入栈中,将软坐字符向前移动,最后依次出栈放入字符数组。代码void match(char train[]){ Stack s; InitStack(s); char *p=train,*q=train,c; while(*p){ if(*p=='H'){ Push(s,*p);...原创 2019-10-14 01:20:52 · 1003 阅读 · 0 评论 -
王道数据结构3.3.6——1、判断一个表达式中的圆括号、方括号和花括号是否配对
思路遍历表达式数组,有上述三种括号时,放入栈中,遇到上述三种括号的反括号时,出栈。直到遍历结束。代码bool match(char str[]){ InitStack(S); int i=0; while(str[i]!='\0'){ switch(str[i]){ //左括号 case '[':...原创 2019-10-14 01:08:28 · 747 阅读 · 0 评论 -
王道数据结构3.2.5——3、用两个栈模拟队列
思路分为栈s1和s2,每次入队前,先检查s1是否满了,满了还得保证s2为空,这样才能全部放入s2中再入栈。每次出队前,检查s2是否为空,若空,则从s1全部放入,再出栈。队满的情况就是s1和s2都满了,队空的情况就是s1和s2都空了。代码int EnQueue(Stack &S1,Stack &S2,ElemType e){ ElemType x; if...原创 2019-10-13 01:58:50 · 205 阅读 · 0 评论 -
王道数据结构3.2.5——1、循环队列中设置tag区分头指针front和队尾指针rear相等时队列的状态是空还是满
入队操作int Enqueue(SqQueue &Q,ElemType x){ if(Q.front==Q.rear&&Q.tag==1){ return 0;//队满 } Q.data[Q.rear]=x; Q.rear=(rear+1)%maxsize; Q.tag=1; return 1;}出...原创 2019-10-13 01:58:43 · 1340 阅读 · 0 评论 -
王道数据结构2.3.7——23、删除单链表中绝对值相等的元素,只保留第一个元素
思路该题要求时间复杂度尽可能高效,因此牺牲空间换时间。设置辅助数组q[n+1],初始化为0.遍历单链表,如果出现数字a,则给q[a]赋值为1;若a重复出现,则删除此结点。代码void del_same(LinkList &head,int n){ LNode *p=head->next,*pre=head; if(p==NULL) return; ...原创 2019-10-12 21:49:38 · 515 阅读 · 2 评论 -
王道数据结构2.3.7——22、查找两个用来表示单词的单链表的公共后缀结点
思路比较两链表长度,较长者指针移动长度差个单位,两表指针再共同移动直到指针相同,即为公共后缀的第一个结点。代码略原创 2019-10-12 21:11:09 · 476 阅读 · 0 评论 -
王道数据结构2.3.7——21、查找单链表上倒数第k个位置的结点
思路设指针k和p遍历单链表,k指向头结点,直到p遍历到第k个位置时,指针k和p同时移动。代码bool find_k(LinkList List,int k){ LNode *p=List,*q=List; if(p->next==NULL){ return 0; } int count=0; while(p->nex...原创 2019-10-12 20:51:26 · 147 阅读 · 0 评论 -
王道数据结构2.3.7——20、使非循环双链表中访问频度最高的结点置于表首
思路主要考察双链表的查找、插入、删除代码DLNode Locate(DLinkList &L,ElemType x){ LNode *p=L->next,*r; //找到值为x的结点DD while(p!=NULL&&p->data!=x) p=p->next; p->freq++; r=p-&g...原创 2019-10-12 20:31:31 · 271 阅读 · 0 评论 -
王道数据结构2.3.7——18、循环单链表的合并
思路主要是注意结尾的处理代码void merge(LinkList &h1,LinkList h2){ LNode *p=h1->next; while(p->next!=h1){ p=p->next; } p->next=h2->next; while(p->next!=h2){ ...原创 2019-10-12 00:08:36 · 187 阅读 · 0 评论 -
王道数据结构2.3.7——19、反复找出并删除循环单链表的最小值,直到表为空
思路与单链表比,结尾不一样了。代码void del_min(LinkList &L){ LNode *pre=L,*p=L->next,*r; while(p->next!=L){ if(p->next->data<pre->next->data) pre=p; else p=p->...原创 2019-10-12 00:09:58 · 392 阅读 · 0 评论 -
王道数据结构2.3.7——17、判断循环双链表是否对称
思路设置头尾指针,向中间遍历代码bool symmetry(LinkList A){ LNode *p=A->next,*q=A->prior; while(p!=q&&q->next!=p){ if(p->data == q->data){ p=p->next; ...原创 2019-10-12 00:09:52 · 563 阅读 · 0 评论 -
王道数据结构2.2.3——16、判断一个单链表是否为另一个单链表的连续子序列
思路ra指针只要和rb不一样,ra往后移一位,rb移到开头;ra和rb相同,两个同时移一位,继续比较。有两种情况要考虑到:A表比B表短、A表比表长。所以最后判断条件为:rb是否到底。代码bool find_child(LinkList A,Linklist B){ LNode *ra=A->next,*rb=B->next; while(ra!=NULL ...原创 2019-10-12 00:09:47 · 714 阅读 · 11 评论 -
王道数据结构2.3.7——15、两单链表的交集存放与其中一个单链表
思路ra指针负责删除和保留A表元素,rb负责遍历B表元素。代码void intersection(LinkList &A,Linklist B){ LNode *ra=A,*rb=B->next,*r,*p; while(ra->next!=NULL && rb!=NULL){ if(ra->next->...原创 2019-10-12 00:09:42 · 241 阅读 · 0 评论 -
王道数据结构2.2.7——14、创建新表放入两个递增序列的单链表的公共元素
思路两表指针比较大小后,在新表中创建结点并赋值。代码void pub(LinkList A,Linklist B,LinkList &C){ C=(LinkList)malloc(sizeof(LNode)); C->next=NULL; LNode *ra=A->next,*rb=B->next,*rc=C; while(r...原创 2019-10-12 00:09:35 · 161 阅读 · 0 评论 -
王道数据结构2.2.7——13、两个递增单链表合并为一个递减单链表
思路设立指针ra,rb分别指向A和B,当两个指针都不为空时,用头插法将两指针中较小者放入C中;当两个指针中有一个为空时,头插法放入另一个指针的元素。直到把A和B的元素都放完。代码void merge(LinkList A,Linklist B,LinkList &C){ C=(LinkList)malloc(sizeof(LNode)); C->next...原创 2019-10-11 22:59:10 · 585 阅读 · 0 评论 -
王道数据结构2.27——12、去除递增有序的单链表中重复的元素
思路边遍历,边比较,边删除代码void del_rep(LinkList &L){ LNode *p=L->next,*r; while(p!=NULL){ if(p->data == p->next->data){ r=p->next; p->next=r-&...原创 2019-10-11 22:08:58 · 182 阅读 · 0 评论 -
王道数据结构2.2.7——11、从一个单链表中分离出两个表
思路创建A、B表头,在hc单链表中遍历拆下结点用尾插法放入A,或用头插法放入B中。代码void divide(LinkList hc,LinkList &A,LinkList &B){ A=(LinkList)malloc(sizeof(LNode)); B=(LinkList)malloc(sizeof(LNode)); A->next...原创 2019-10-11 21:51:37 · 199 阅读 · 0 评论 -
王道数据结构2.2.3——10、数组中的两个顺序表互换位置
思路遍历A中的奇数,用尾插法插入B中代码void divide(LinkList A,LinkList &B){ B=(LinkList)malloc(sizeof(LNode)); B->next=NULL; LNode *p=A,*q=B; while(p->next!=NULL){ if(p->next-...原创 2019-10-11 21:34:56 · 307 阅读 · 0 评论 -
王道数据结构2.2.7——9、按递增次序输出带头结点的单链表元素,并释放结点存储空间
思路1、直接插入排序,然后遍历输出结点并删除结点2、遍历n次,每次找到最小值删除。✔代码void del_min(LinkList &head){ LNode *pre,*p,*r; while(head->next!=NULL){ pre=L;p=pre->next; while(p->next!=NUL...原创 2019-10-11 21:18:25 · 519 阅读 · 0 评论 -
王道数据结构2.2.3——8、找处两个单链表的公共结点
思路注意,两个单链表有公共结点意味着,只要有一个公共结点,那么后继的所有结点都是完全一样的。因此,两个单链表相当于“Y”的形状。由于两个链表长度不一定相等,所以算出长度差d之后,用较长的单链表遍历到第d个位置,然后两个表开始一起遍历,直到两个指针所指元素是同一个,也就是第一个公共结点,后面的所有结点都是公共结点。代码LinkList pub_node(LinkList L, Link...原创 2019-10-11 03:00:49 · 249 阅读 · 0 评论 -
王道数据结构2.2.4——7、删除带头结点的无序单链表中大小介于给定两个值之间的元素
思路边遍历,边删除代码void del_betw(LinkList &L, ElemType s, ElemType t){ LNode *p=L->next,*pre=L; while(p!=NULL){ if(p->data>s && p->data<t){ pre-&g...原创 2019-10-11 01:53:25 · 257 阅读 · 0 评论 -
王道数据结构2.2.4——6、使带头结点的单链表递增有序
思路直接插入排序法,也是取下头结点,再一个一个按递增顺序插入进来。代码void sort(LinkList &L){ LNode *q=L->next,*p=q->next,*r; q->next=NULL; while(p!=NULL){ q=L; while(p->data>q->...原创 2019-10-11 01:44:21 · 339 阅读 · 1 评论 -
王道数据结构2.2.4——5、带头结点的单链表就地逆置
思路把头结点取下,然后用头插法逆置代码void reverse(LinkList &L){ LNode *p=L->next,*r; L->next=NULL; while(p!=NULL){ r=p->next; p->next=L->next; L->next=p;...原创 2019-10-11 00:56:59 · 246 阅读 · 0 评论 -
王道数据结构2.2.4——4、删除带头结点的单链表中唯一的最小值结点
思路设置p和pre一对指针负责遍历,设置min和min_pre一对指针负责指向最小值。代码void del_min(LinkList &L){ LNode *p=L->next,*pre=L; LNode *min=L->next,*min_pre=L; while(p!=NULL){ if(p->data<mi...原创 2019-10-11 00:44:47 · 275 阅读 · 0 评论 -
王道数据结构2.2.4——3、反向输出带头结点的单链表的每一个值
思路1、头插法逆转顺序,再遍历一次。✔2、递归遍历输出代码void deverse(LinkList L){ LNode *p=L,*q=L->next; p->next=NULL;p=NULL; while(q!=NULL){ //头插法 L->next=q; q=q->next; ...原创 2019-10-09 02:34:30 · 393 阅读 · 1 评论 -
王道数据结构2.2.4——2、删除带头结点的单链表中值为x的所有结点
思路不需要思路代码void del_x(LinkList L, ElemType x){ LNode *p,*pre,*r; p=L->next; pre=L; while(p!=NULL){ if(p->data==x){ r=p; pre->next=p->ne...原创 2019-10-09 02:17:47 · 459 阅读 · 2 评论 -
王道数据结构2.2.4——1、设计递归算法删除不带头结点的单链表L中所有值为x的结点
思路递归包含三个部分:出口、调用本身、删除操作。代码void del_x(LinkList &L,ElemType x){ LNode *p; if(L==NULL){ return; } if(L->data==x){ p=L; L=L->next; free(p);...原创 2019-10-09 02:11:31 · 677 阅读 · 0 评论 -
王道数据结构2.2.3——13、找出整数数组中未出现的最小正整数
思路方法一:给整数数组排序,指针指向最小数,并开始往后检查每个数,如果是负数则一直跳过,直到遇到大于等于0的数,开始检查每个数是不是前一个数加一,如果不是,则返回这个未出现的最小正整数。方法二:创建一个数组,用于标记原序列中出现过的数字,再找出最小的没有标记的数字。(✔)代码void findmin(int A[],int n,int &m){ int min=A...原创 2019-09-29 01:15:07 · 313 阅读 · 0 评论 -
王道数据结构2.2.3——12、求整数序列中的主元素
思路无法理解标准答案的候选元素,因此选择自己的方法:对数组进行循环,每次循环以删除首元素及与首元素相等的整数,边删除边计数,判断数量是否大于n/2。删除完的数组继续第二次循环,直到数组里的元素都删完。代码void findmain(int A[],int n,int &main){ int i=0,p,q,first,count; while(A[i]){ ...原创 2019-09-28 00:51:59 · 420 阅读 · 0 评论 -
王道数据结构2.2.3——11、找出两个等长升序序列的中位数
思路(以下都是个人看法与解答)方法一:合并两表,找出中位数方法二:求出表长度,再用两指针按大小遍历两表,找出在表长度/2的位置(✔)代码void findmid(ElemType A[],ElemType B[]){ int i; //i为A的长度,也是两表合并后中位数的位置 for(i=0;A[i];i++); int p=-1,q=-1,...原创 2019-09-28 00:15:30 · 390 阅读 · 0 评论 -
王道数据结构2.2.3——10、数组中的n个数的序列循环左移p个位置
思路和8题一样的解法代码void reverse(ElemType &A[],int first,int last){ int temp; while(first<last){ temp=A[first]; A[first]=A[last]; A[last]=temp; }}void move(...原创 2019-09-27 17:11:18 · 127 阅读 · 0 评论 -
王道数据结构2.2.3——9、用最少时间找到递增顺序表中的x,若有则与其后继元素互换,若无则插入
思路对递增序列可以用折半查找法。找到x的时候,只要它的位置不是表尾,就和后继元素交换。没找到的时候,x应插在high指针之后。代码void nine(SqList &L,ElemType x){ int low=0,high=L.length-1; while(low<=high){ int mid=(low+high)/2; ...原创 2019-09-26 20:51:31 · 221 阅读 · 0 评论 -
王道数据结构2.2.3——8、数组中的两个顺序表互换位置
思路这种顺序表前面和后面两部分互换位置的思路,通常就是分别逆置前面和后面,最后逆置整个顺序表。如:1,2,3,4,5,6 中,要让1,2,3,4 和 5,6 互换位置,只需逆置两部分:4,3,2,1 ,6,5 ,最后再整体逆置:5,6,1,2,3,4代码void reverse(ElemType &A[],int first,int last){ int ...原创 2019-09-26 17:39:47 · 520 阅读 · 0 评论 -
王道数据结构2.2.3——7、合并两个有序顺序表为新的有序顺序表
思路设置两个指针 p 和 q 分别指向两个有序表 A 和 B,p和q指向值较小的元素放入新表C中,并且指针后移一位,直到两个指针中有一个走到表尾。最后,如果有指针还没走到表尾,则把指针后的值全部放入新表中。代码bool merge(SqList A, SqList B, SqList &C){ if(A.length+B.length>C.maxSize){ ...原创 2019-09-26 17:22:05 · 334 阅读 · 0 评论 -
王道数据结构2.2.3——6、从有序顺序表中删除其值重复的元素
思路参考按值删除代码void del_re(SqList &L){ int i,j; for(i=1,j=1;i<L.length;i++){ if(L.data[i]!=L.data[i-1]){ L.data[j]=L.data[i]; j++; } } ...原创 2019-09-26 16:25:23 · 645 阅读 · 0 评论 -
王道数据结构2.2.3——5、从无序顺序表中删除其值在s与t之间的所有元素(包括s和t)
思路类似按值删除的方法,设置指针 k 来过滤要删除元素代码bool del_st(SqList &L,ElemType s,ElemType t){ if(s>=t||L.length==0){ return false; } int k=0; for(int i=0;i<L.length;i++){ ...原创 2019-09-26 15:38:05 · 242 阅读 · 0 评论