数据结构问题
The C
Don't tell me the sky is the limit when there are footprints on the moon.
展开
-
数据结构及算法程序设计习题篇(一)
题目:已知两颗二叉树,将它们合并成一颗二叉树。合并规则是:都存在的结点,就将结点值加起来,否则空的位置就由另一个树的结点来代替。例如:两颗二叉树是:Tree 11/ \3 2/5Tree 22/ 1 3\ 4 7合并后的树为3/ 4 5/ \ 5 4 7思想:根据题意,可以将问题划分为多个子问题,故使用递归的方法,注意程...原创 2020-08-04 21:33:20 · 1599 阅读 · 0 评论 -
排序专题——七大排序算法完整版
不要逼逼赖赖,有本事键盘上敲一敲好了,直接上代码!!!#include<stdio.h>#include<stdlib.h>#include<string.h>#include <malloc.h>void bubbleSort(int *arr,int n){ for(int i=0; i<n; i++){ ...原创 2019-11-16 21:11:56 · 704 阅读 · 2 评论 -
Leetcode126——给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。
题目:给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 be...原创 2019-10-26 21:48:20 · 2575 阅读 · 0 评论 -
动态规划——扰乱字符串问题
给定一个字符串 s1,我们可以把它递归地分割成两个非空子字符串,从而将其表示为二叉树。下图是字符串 s1 = “great” 的一种可能的表示形式。在扰乱这个字符串的过程中,我们可以挑选任何一个非叶节点,然后交换它的两个子节点。例如,如果我们挑选非叶节点 “gr” ,交换它的两个子节点,将会产生扰乱字符串 “rgeat” 。我们将 "rgeat” 称作 “great” 的一个扰乱字符串...原创 2019-10-26 21:29:28 · 186 阅读 · 0 评论 -
数据结构与算法之递归系列
递归的分析与总结题目:有 5 个人坐在一起,问第 5 个人多少岁,他说比第 4 个人大 2 岁。问第 4 个人多少岁,他说比第 3 个人大2岁。问第 3 人多少岁,他说比第 2个 人大 2 岁。问第2个人多少岁,他说比第 1 个人大 2 岁。最后问第 1 个人,他说他是 10 岁。编写程序,当输入第几个人时求出其对应的年龄。题目:斐波那契数列题目:一只青蛙一次可以跳上 1 级台阶,也可以跳上...原创 2019-10-25 21:23:13 · 325 阅读 · 0 评论 -
关于树与二叉树的问题的一些理解和总结
树与二叉树的主要题型:1.重建二叉树2.二叉树的下一个结点3.树的子结构(判断B是不是A的子结构)4.二叉树的镜像(判断一棵二叉树是不是对称的)5.对称二叉树(同上)6.从上到下打印二叉树(层次遍历)7.二叉树的后续遍历序列(重点是非递归)8.二叉树从根结点到某一节点的路径上结点值的和为sum,输出这样的结点和整个序列9.序列化二叉树(序列化和反序列化,即根据前中后任意一种遍历构...原创 2019-10-25 20:30:42 · 432 阅读 · 0 评论 -
二路归并排序
/*************************************************函数名称:mergearray*参数:a:待归并数组;first:开始下标;mid:中间下标;* last:结束下标;temp:临时数组*说明:将有二个有序数列a[first...mid]和a[mid...last]合并 ******************************...原创 2019-10-24 20:47:42 · 92 阅读 · 0 评论 -
堆排序
https://blog.csdn.net/l577217/article/details/80516654原创 2019-10-24 20:33:59 · 71 阅读 · 0 评论 -
选择排序
每次找最小或者最大的放在头或者尾部,然后遍历下去,依次把剩下元素中最小或者最大的放在第一个元素后面void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}void SelectSort(int *arr, int length){ if (arr == NULL || length &l...原创 2019-10-24 19:55:05 · 91 阅读 · 0 评论 -
快速排序——使用广泛!!!
void quickSort(int *nums, int left, int right){ if (left > right) return; int low = left; int high = right; int base = nums[left]; while (low < high) { whil...原创 2019-10-24 19:47:00 · 390 阅读 · 0 评论 -
双向起泡排序(冒泡排序的优化)算法
#include "stdio.h" //交换数字 void swap(int *a,int *b){ int temp; temp=*a; *a=*b; *b=temp;} //双向起泡排序 void bubbleSort(int a[],int n){ int low=0,high=n-1; int i,j; int flag=1;//一趟排序结束是否有交换 wh...原创 2019-10-24 17:00:30 · 1649 阅读 · 0 评论 -
floyd算法应用场景
Floyd算法编程题目:编程求解几座城市之间的最短距离,以及最短距离所经过的城市。#include <string.h> #include <stdio.h> #define NUMS 12 #define INF 65535 typedef struct { char vertex[NUMS]; int ed...原创 2019-10-24 16:20:31 · 1244 阅读 · 1 评论 -
prim算法
主要思想:以顶点为主线,构成生成树。把图的顶点分成两类,一类是生成树中的点(类A),另一类是图余下的点(类B)。从与类A中的点相邻接的,属于类B的点中,选择权值最小的边,把它加入到生成树中,直到图中所有顶点被加入类A。int Prim(Graph g){ int sum = 0, v; int vset[Max]; info lowcost[Max];//保存最小生成树的顶点是谁拉进来...原创 2019-10-24 15:37:18 · 91 阅读 · 0 评论 -
查找专题
题目:一个长度为L(L ≥ 1)的升序序列S,处在第[L/2]个位置的数。例如,对于两个升序序列S1=(11,13,15,17,19),则S1的中位数为15。若又有一个升序序列S2=(2,4,6,8,20),两个序列的中位数定义为它们所有元素的升序序列的中位数,则S1和S2的中位数为11.现有两个等长的用单链表存储的升序序列A和B,设计一个算法,找出两个序列A和B的中位数。代码展示:假设不是单...原创 2019-10-24 10:03:48 · 926 阅读 · 0 评论 -
树与二叉树专题
题目:原创 2019-10-13 21:49:00 · 205 阅读 · 0 评论 -
数据结构——队列的基本操作
队列:简称队,一种受限的线性表,只允许在表的一端进行插入,在表的另一端进行删除操作(先进先出)队头:进行删除的一端队尾:进行插入的一端空队列:不含任何元素的空表队列的基本操作:队列分为顺序队列、循环队列和链式队列,顺序队列容易发生假溢出现象(队尾超过限定长度),故不常用,下面是循环队列和链式队列的基本操作附上链式队列的指针变化图:代码实现:#include <stdio.h...原创 2019-07-27 10:37:28 · 638 阅读 · 0 评论 -
LeetCode61——给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
题目:给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。思想:假设n个元素,即把后面n-k个元素依次头插即可代码展示:/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */st...原创 2019-08-18 15:18:12 · 3059 阅读 · 0 评论 -
数据结构——(树与二叉树)给定一个二叉树和整数sum,找出所有根节点到叶子结点的路径,这些路径上的结点值累加和为sum
题目:给定一个二叉树和整数sum,找出所有根节点到叶子结点的路径,这些路径上的结点值累加和为sum思想:遍历二叉树的思想,结合栈的使用代码展示:void EqualSum(BiTree T,Stack &S,int sum,int &x){ if(T==NULL) { return; } Push(S,T->data);...原创 2019-09-03 14:44:19 · 1288 阅读 · 1 评论 -
数据结构——(树与二叉树)已知二叉树,找出二叉树中给定两个结点的最近公共祖先
题目:已知二叉树,找出二叉树中给定两个结点的最近公共祖先思想:遍历二叉树,利用栈保存结点,然后对栈进行查找代码展示:void findWay(BiTree T,Stack &S,int x,int &finish){ int e; if(T==NULL || finish==1) { return ; } Push(S...原创 2019-09-03 15:52:40 · 455 阅读 · 0 评论 -
数据结构(树与二叉树)——给定一棵二叉树,将该二叉树就地转化为单链表,单链表中结点顺序为二叉树前序遍历顺序
题目:给定一棵二叉树,将该二叉树就地转化为单链表,单链表中结点顺序为二叉树前序遍历顺序思想:如果右子树不为空,则右子树最后肯定为左子树最后一个靠右的孩子节点的右子树,而左子树最后成为整棵树的右子树。这样,首先判断左子树是否为空,不为空就寻找到树根的左孩子节点,然后寻找该节点是否有右孩子,如果有继续寻找,直到找到属于叶子节点的右孩子,此时,该节点的右子树“指向”当前树的右子树,并将当前左子树变为树...原创 2019-09-03 19:48:10 · 258 阅读 · 0 评论 -
数据结构——(树与二叉树)二叉树的层次遍历
1.递归方式代码展示:void levelOrder(BiTree T,SqQueue &Q){ if(T==NULL) { return; } EnQueue(Q,T); while(QueueEmpty(Q)==0) { BiTree x; DeQueue(Q,x); ...原创 2019-09-03 21:00:33 · 123 阅读 · 0 评论 -
数据结构——(树与二叉树)给定一棵二叉树,假设从二叉树的右侧观察它,将观察的结点按照从上到下输出
题目:给定一棵二叉树,假设从二叉树的右侧观察它,将观察的结点按照从上到下输出思想:利用层次遍历,从上到下依次输出这一层的最后一个元素即可,注意将层数与结点一起入队代码展示:void fromTheSide(BiTree T,SqQueue &Q){ if(T==NULL) { return; } EnQueue(Q,T,1); ...原创 2019-09-04 14:55:14 · 575 阅读 · 0 评论 -
数据结构——(图)图的邻接矩阵构造与表示
代码展示:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>#define MaxSize 100typedef struct MGraph{ char Vex[MaxSize];//顶点表 int Edge[MaxSi...原创 2019-09-05 15:32:36 · 176 阅读 · 0 评论 -
数据结构——(图)图的邻接表
邻接表的出现是因为图若是稀疏图,用邻接矩阵会造成空间的浪费,毕竟你要开辟一个一维数组和一个二维数组嘛,而且还是大开小用的那种。邻接表为了避免内存的浪费引入了链式存储,它的处理办法是:1.用一个一维数组存储顶点,当然你也可以用单链表存储,2.用单链表存储顶点的邻接点,可以将顶点改为结构体数组,结构体中存放邻接点的指针,邻接点也创建一个结构体,定义指针next存放该顶点的另一个邻接点,这样就可以...原创 2019-09-05 16:45:46 · 268 阅读 · 0 评论 -
数据结构——(图)图的广度遍历
思想:借助栈来实现代码展示:int visited[MAXVERTEX] = {0};void visit(ALGraph G,int i){ if(visited[i]==0) { printf("访问顶点%c\n",G.adjlist[i].data); }}void BFS(ALGraph G,SqQueue &Q,int v)/...原创 2019-09-05 20:09:33 · 222 阅读 · 0 评论 -
数据结构——(图)图的深度遍历(包含广度遍历完结版)
代码展示:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>#define MaxSize 50#define MAXVERTEX 100 //最大顶点数typedef struct ArcNode //边表节点{ in...原创 2019-09-05 20:49:58 · 170 阅读 · 0 评论 -
线性表专题
题目:设计算法分段逆置线性表。例如线性表(1,2,3,4,5,6,7,8),按k等于3分段逆置得到(3,2,1,6,5,4,8,7)代码展示:(此题注意死循环,故使用r保存p的位置,防止断链或死循环)void Reverse(LinkList &L,int k){ LinkList s = L; LinkList p,q; p = s->next; ...原创 2019-09-15 22:00:07 · 149 阅读 · 0 评论 -
栈、队列、串专题
题目:设有一个元素类型为整型的栈S,设计一个算法,借助另一个栈实现把该栈的所有元素从栈顶到栈底按从小到大次序排列起来代码展示:(注意来回倒时候终止条件)void SortByAnotherStack(Stack &S1,Stack &S2){ if(S1.top==-1 || S1.top==0) return; int t,temp; while(S...原创 2019-10-08 20:31:12 · 316 阅读 · 0 评论 -
数据结构——设计一个算法,判断一个算数表达式中的括号是否配对。算数表达式保存在带头结点的单循环链表中,每个结点有两个域:ch和link,其中ch域为字符类型。
题目:设计一个算法,判断一个算数表达式中的括号是否配对。算数表达式保存在带头结点的单循环链表中,每个结点有两个域:ch和link,其中ch域为字符类型。思想:利用栈进行匹配,所有左括号进栈,右括号匹配栈顶元素,不匹配表达式不配对。代码展示:int kuohao(LinkList L){ char s[100],t; int top=-1; LinkList p=L...原创 2019-08-18 15:09:08 · 4387 阅读 · 0 评论 -
数据结构——有一个带头结点的单链表,设计算法使其元素递增有序。(只改变指针)
题目:有一个带头结点的单链表,设计算法使其元素递增有序。思想:注意断链!!!!代码展示:void Sort(LinkList &L){ if(L->next==NULL || L->next->next==NULL) { return ; } LinkList p,pre,q; p=L->next-&...原创 2019-08-18 14:10:24 · 13135 阅读 · 12 评论 -
数据结构——将两个有序链表合并成一个有序链表(只移动指针)
问题:将两个有序链表合并成一个有序链表代码展示:void Merge(LinkList &P,LinkList &Q,LinkList &L){ LinkList p = P->next; LinkList q = Q->next; LinkList l = L; while(p!=NULL && q!=NU...原创 2019-08-17 17:29:15 · 1409 阅读 · 5 评论 -
数据结构——线性表2.6
题目:试着设计一个在时间上高效的算法,使得单链表A中的元素递减有序。思想:一般的方法是将单链表直接进行比较,进而实现该算法,但其实这样做并不高效,时间复杂度为O(n^2),我们可以将要存放在单链表中的数据线用一种较为高效的算法进行排序,进而再采用头插法插入单链表中,这样时间复杂度会更好一些。代码展示:#include <stdio.h>#include <stdlib....原创 2019-08-09 22:06:57 · 134 阅读 · 0 评论 -
数据结构——线性表2.5
题目:试着编写一个算法,空间复杂度为O(1),将带头结点的单链表A中的元素全部逆置。思想:本题看似是一个反转的题目,但是却与普通的数据逆置略微有所区别,众所周知,单链表的元素插入有头插法和尾插法,其中,头插法其实在输出时候就相当于逆置的顺序输出格式,所以本题只需要将第一个节点单独取出来保存,对后面的所有元素在头结点L(或者叫Head)后面再做一遍头插法就好了。代码展示:#include &...原创 2019-08-09 21:50:35 · 225 阅读 · 0 评论 -
字符串——改变大小写问题
题目:给定一个字符串,要求改变最少数量的字符,使这个字符串中只含有大写或者小写字母,若大小写字母的个数一样,则全部变为小写字母思想:本题较为简单,计算字符串的大写或者小写的个数然后进行比较即可,再将其余的按要求变为大写或小写代码展示:#include <stdio.h>#include <stdlib.h>/*题目:给定一个字符串,要求改变最少数量的字符,...原创 2019-08-13 21:36:02 · 1533 阅读 · 1 评论 -
数据结构——在一个有序表中,现在要插入一个元素,要求在插入后不改变表的有序性
题目:在一个有序表中,现在要插入一个元素,要求在插入后不改变表的有序性(要求采用一种时间复杂度较低的算法,所采用的的数据结构不限)思想:本题有多种做法,但是最少的时间复杂度是申请一个新的顺序表,一次比较后插入,时间复杂度为O(N),这是典型的以空间换时间的做法。代码展示:#include<stdio.h>#include<stdlib.h>#define Ele...原创 2019-08-13 21:00:40 · 2041 阅读 · 0 评论 -
LeetCode19——给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点(给定的 n 保证是有效的,你能尝试使用一趟扫描实现吗?)
题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点(给定的 n 保证是有效的,你能尝试使用一趟扫描实现吗?)思想:采取双重遍历肯定是可以解决问题的,但题目要求我们一次遍历解决问题,那我们的思路得发散一下。我们可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。代码展示:...原创 2019-08-18 17:02:06 · 579 阅读 · 0 评论 -
数据结构——找出单链表中的最小值,把该节点插入到第一个节点位置
题目:找出单链表中的最小值,把该节点插入到第一个节点位置思想:先进行查找操作,注意保存前驱结点指针(通过该这个才能寻找到最小元素的结点),然后进行简单的交换操作,这里注意考虑最小值结点的所在位置,头和尾要分开来考虑。代码展示:#include <stdio.h>#include <stdlib.h>#include <malloc.h>/*题目...原创 2019-08-13 20:17:05 · 5784 阅读 · 1 评论 -
数据结构——栈的基本操作
栈的概念:栈是只允许在一端进行插入和删除操作的线性表(先进后出)栈顶:栈顶是可以进行插入和删除的那一端栈底:栈底是固定的,不可以进行插入和删除的操作空栈:不含任何元素的空表基本操作代码**(包含顺序栈和链栈)**:#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define Max...原创 2019-07-27 10:22:15 · 142 阅读 · 0 评论 -
数据结构——线性表2.3
题目:设L为带头结点的单链表,编写算法实现从头到尾反向输出每个结点的值。思想:递归操作代码实现:#include <stdio.h>#include <stdlib.h>#include <malloc.h>typedef struct LinkNode{ int data; struct LinkNode *next;}Li...原创 2019-07-31 21:13:35 · 148 阅读 · 0 评论 -
数据结构——快速寻找单链表中最中间的元素(不看值的大小只看位置)
题目:给若干个数字,默认为int类型,要求使用单链表存放,现需要寻找该单链表中位于最中间的数字,要求使用一种在时间和空间上都高效的算法实现。思想:单链表是一种线性结构,每个元素只可有他的前驱结点进行访问,若使用一般方法对单链表进行逐个遍历看是否为那个位于最中间的数字显然是不符合要求的,所以我们采取其他的方法,类似于标尺一般————使用双指针,都指向头指针,一个快一个慢,快指针的后移速度是慢指...原创 2019-07-30 22:00:04 · 1138 阅读 · 0 评论