
每日一题
数据结构每日一题练习
而塞过
代码创造世界
展开
-
每日一题———38.归并排序
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出概念归并排序:把两个或者多个已经有序的序列合并成一个序列思想(合并)创建一个辅助空间数组,用于暂时存放需要比较的数组元素每次从辅助数组中选择两个元素( low ,mid+1)进行比较将较小的元素放入原数组一直循环直到辅助数组的下标超过表长将未遍历完的数据直接插入原数组思想(排序)将数据元素从中间划分成两个子序列左侧子序列递归排序右侧子序列递归排序将数据归并//创建辅助数.原创 2021-06-23 00:51:05 · 224 阅读 · 0 评论 -
每日一题———37.堆排序
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出概念堆:n个关键序列L[1,2…n],满足下面一条性质称为堆大根堆:满足L(i) >= L(2i) 且L(i)>=L(2i+1)小根堆:满足L(i) <= L(2i) 且L(i)<=L(2i+1)可以类比二叉树,(2i左边叶子节点,2i+1右边叶子节点),但是不一样的是,在大根堆中只需要满足:根 >= 左 右与顺序无关,小根堆也一样:只要满足:根 < 左 右即可.原创 2021-06-22 00:22:05 · 666 阅读 · 0 评论 -
每日一题———36.选择排序之快速排序
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出思想选择一个基准( 常为数组第一个元素),利用俩个指针 low 和 high,依次对基准元素进行比较,使大于基准的元素在右边,小于基准的元素在左边,故基准的位置可以确定(k 次快速排序可以使 k+1 个元素在最终位置上)此时基准元素将数据分成两部分,一部分大于基准元素,一部分小于基准元素,对这两部分的元素分别再次进行快速排序,直到序列有序//确定位置int partition(int .原创 2021-06-21 00:30:16 · 236 阅读 · 0 评论 -
每日一题———35.希尔排序
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出思想利用 n / d 将数据分成若干个份子表对这若干份子表进行直接插入排序缩小增量 d ,再次分成若干份子表再次对子表直接插入排序,至有序void ShellSort(int a[],int n){ int i,j,d; for(d=n/2;d >= 1; d=d/2) //一直缩小增量 for(i = d+1 ;i <=n ;i++) if(a[i] <.原创 2021-06-19 23:55:55 · 349 阅读 · 3 评论 -
每日一题———34.树的层序遍历
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出要点链表的遍历链表的数据查找尾插法(留尾链)思想(借助队列)根节点入队,出队访问出队节点如果节点存在左子树则将左子树入队如果节点存在右子树则将右子树入队一直循环直到队列为空void LevelOrder(BiTree T){ InitQueue(Q); //初始化队列 Bitree p; EnQueue(Q,T); //根节点入队 while(!IsEmpty(Q)).原创 2021-06-19 23:42:23 · 104 阅读 · 0 评论 -
每日一题———33.后续访问的非递归实现
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出相比先序和中序的非递归实现(差异只是在访问在入栈和出栈的先后顺序);而后序的非递归实现则要复杂一点,因为后序的顺序是左右根的顺序,所以要对右子树进行判断;判断条件有两个(同时满足) :1.右子树是否为空2.右子树是否被访问过思想 (借助栈实现)将沿着根的左孩子依次入栈,直达左孩子为空判断右子树是否为空且是否被访问过,如果满足则对右子树重复 1 的操作否则出栈,访问节点,且标记最近访问.原创 2021-06-19 00:45:04 · 139 阅读 · 0 评论 -
每日一题———32.插入排序的实现
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出算法思想每一次将一个待排序的记录按照关键字大小,插入到已排好的子序列中,依次与前面关键字做比较效率分析时间复杂度:平均 O(n2),最好O(n),只需要对比无需移动数据,最坏 O(N2)既要比较又要移动数据空间复杂度:O(1)稳定性好带哨兵法void InsertSort(int a[],int n){ int i,j; for(i = 2;i<n;i++){ //a[0].原创 2021-06-18 00:38:01 · 173 阅读 · 2 评论 -
每日一题———31.非递归实现树的中序遍历
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出思想 (借助栈实现)将沿着根的左孩子依次入栈,直达左孩子为空栈顶元素出栈,并且访问节点(对节点操作),若若孩子为空则继续指行否则执行 1 操作,直到栈为空,或者节点为空void InOrder(BiTree T){ BiTree p =T ;//新建树对象,对树操作 //初始化栈 InitStack(S); while(p || IsEmpty(S))//栈非空,或者树非空 { .原创 2021-06-17 23:09:46 · 106 阅读 · 0 评论 -
每日一题———30.树的相关解题技巧
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出树相关解题技巧在完全二叉树中,N0=N2+1(度为0的结点个数 = 度为 2 的结点个数 + 1)在完全二叉树中,N1(常为 0 或 1)在完全二叉树中,叶子结点个数为 i > n / 2, ( n为总结点个数,i ~ n都是叶子节点的个数)在得到树的先序遍历 + 后序遍历的情况下,若先序:XY 后序:YX则X是Y的祖先节点,(不唯一)在得到树的中序遍历 + 后序遍历(先序遍历)的情况下.原创 2021-06-16 23:51:38 · 144 阅读 · 2 评论 -
每日一题———29.树的三种遍历
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出要点树的先序遍历(根左右)树的中序遍历(左根右)树的后序遍历(左右根)//先序void PreOrder(BiTree T){ //非空按根左右的顺序遍历 if(T !=NULL){ visit(p); preorder(T->lchild); preorder(T->rchild); }}//中序遍历void Inorder(BiTree T){ //.原创 2021-06-15 23:46:27 · 190 阅读 · 2 评论 -
每日一题———28.二叉树中寻找编号为i和j的最近祖先节点(顺序存储)
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目给定一个二叉树按顺序存储,要求设计一个算法实现寻找结点 i 和 j 的最近祖先节点相关知识二叉树的顺序存储(完全二叉树和满二叉树用此方式比较多,而在普通二叉树的情况下会将其补充数据伪装成一个满二叉树来存储,方便使用满二叉树的特性)为了维持二叉树的节点顺序和数组顺序一致可以从1开始存储祖先节点是子节点的 1/2思想要注意判断结点的值信息不断的将较大的结点值取一半,知道 i 和 j.原创 2021-06-14 01:15:56 · 735 阅读 · 3 评论 -
每日一题———27.重新排列线性表的顺序
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目设线性表L为{a1,a2,a3…an-1,an}采用头节点的单链表保存,按要求重新排列L中的各个结点,得到线性表的顺序为{a1,an,a2,an-1…}要点双指针的使用头插法逆置结点思想分析插入后的结点的规律是间隔顺序递增,但是给出的后部分结点是递减,且结点可以分为两部分找到中间节点(两个指针,快指针一次走两步,慢指针一次走一步,故在快指针到达链尾的时候,慢指针在中间结点)将后部.原创 2021-06-13 01:46:12 · 768 阅读 · 1 评论 -
每日一题———26.删除链表中绝对值相同的结点,仅保留第一次出现的结点
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出要点分配节点数组初始化删除结点辅助数组的释放思想利用一个标记数组来记录访问的情况将结点中的值变成数组中的下标值在第一个访问到一个结点就利用辅助数组将节点中的值对应下标的值置为1,在下一次访问到时,就将结点删除利用三元组将节点中的值变成正数涉及到节点的释放利用一个pre指针获取节点的前驱,方便删除void Delete_Same(Linklist L,int n){{ int.原创 2021-06-12 00:14:31 · 633 阅读 · 2 评论 -
每日一题———24.寻找单链表的倒数第k个位置的结点
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目给定一个带有表头节点的单链表list,要求在不改变链表的结构下找到链表中倒数k个位置的节点,查找成功输出该节点的值并返回1,否则返回0思路方法一:第一次遍历确定链表的长度l,第二次遍历找到l-k+1个位置的节点(不推荐,时间复杂度高,遍历两次)方法二:借助一个辅助空间,遍历一次将所有节点的data域的数据存入辅助空间中,通过随机读取的方式来读取第k个数据(不推荐,空间复杂度高)方法三.原创 2021-06-09 23:37:44 · 211 阅读 · 3 评论 -
每日一题———23.中缀表达式转换
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出中缀转后缀的方法常规方法遇到操作数(a,b,c)的时候:直接输出,添加到后缀表达式中栈为空的时候,遇到运算符直接输出遇到左括号:将其入栈遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出的元素是左括号(左括号不输出直接删除)遇到其他运算符:加减乘除,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈比较入栈元素和栈顶元素,只有优先级小于栈顶元素才入栈,其余都出栈最终将栈的.原创 2021-06-09 00:13:49 · 155 阅读 · 4 评论 -
每日一题———22.定位双向链表的数据,并且记录访问频率,按访问频率排序
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目给定一个头指针L为带头结点的非循环双向链表,并且节点内多了一个freq域(记录访问次数),按要求实现一个Locate(L,X)算法,实现定位查找X值,并且在找到X的时候freq+1,同时将链表中的结点保持访问次数递增排列要点双链表的遍历双链表的结点插入双链表的结点提取思想遍历整个双链表,找到元素值为X的结点,并且freq+1将该节点取下,遍历整个双链表寻找到小于该节点的freq的.原创 2021-06-08 00:16:36 · 792 阅读 · 5 评论 -
每日一题———21.按顺序删除带头循环单链表的节点
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目设有一个带头结点的循环单链表,其数据节点的元素均为正整数,要求设计一个算法实现循环删除最小元素的节点,并输出元素的值,最后将头节点删除要点循环链表的遍历节点的删除思想遍历循环链表(遍历指针不为头指针的情况下)寻找通过一个指针标记最小的元素节点,并且需要一个最小节点指针的前驱便于删除节点一直循环查找,标记最小值节点,删除退出循环则删除头节点void DeleteMin(Lin.原创 2021-06-07 00:12:37 · 194 阅读 · 1 评论 -
每日一题———20.判断带头双链表是否对称
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出bl80NTc0MjEwMA==,size_16,color_FFFFFF,t_70#pic_center)要点双链表的遍历思想(双指针线性查找)借助双链表的前驱指针和后继指针分别从左边和右边遍历,直到指向同一个节点(双链表的节点数量为偶数)或者相连节点(双链表的节点数量为偶数)说明该双链表为对称bool symmetry(DLinklist L){ DNode *p *q; p=L.原创 2021-06-05 23:45:10 · 415 阅读 · 5 评论 -
每日一题———19.求两个链表的公共节点
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目已知两个链表A,B分别表示两个集合,其元素递增排列,编制函数,将A,B的交集放入A中要点链表的遍历链表的数据查找节点的删除思想要将A中的元素和B来比较因为A中保存的是集合,故在数据不相同的时候将元素所属的节点删除(删除较小的),因为元素的递增排列的只有在两个链表的节点元素都一样才将A中的节点保留在A中有剩余时直接删除剩余节点,只保留公共的元素在B有剩余的时候也直接删除节点.原创 2021-06-05 00:53:10 · 227 阅读 · 0 评论 -
每日一题———18.两个递增的单链表归并成一条递减的单链表
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出要点链表的遍历头插法思想(双指针线性查找)因为原来的元素顺序的递增,操作过后变成递减,故采用头插法可以实现设置两个链表指针,让两个链表节点一起遍历比较两个指针结点中的元素,将小的元素节点插入当一条链表遍历完时,另外一条还有数据,则继续头插法将剩余节点添加Linklist merge(Linklist &A,Linklist &B){ Lnode *p = A-&g.原创 2021-06-04 00:13:29 · 284 阅读 · 0 评论 -
每日一题———17.一个链表按要求分成两个链表
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目设C={a1,b1,a2,b2…,an,bn}为线性表,采用带头结点的hc单链表,设计一个就地算法,将其拆分为两个线性表,使得A={a1,a2,…,an},B={b1,b2,…bn}要点链表的遍历头插法(防止断链)尾插法(留尾链)思想由题目可知A是正序的B是倒序,故A可以采用尾插法,B采取头插法遍历整个链表,第一个节点插入A中第二个插入B中,一直循环,直至整个链表为空Link.原创 2021-06-02 23:17:58 · 823 阅读 · 3 评论 -
每日一题———16.单链表分成两个链表
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目将一个带头结点的单链表A按照A的序号分为A和B两个链表,其中A链表保存奇数序号的节点,B保存偶数的序号节点链表图要点链表的位置奇偶判断节点的创建尾插法(留尾链)思想(双指针线性查找)创建新链表B(保存偶数位置的节点)遍历整个链表,在偶数位置将节点加入到新链表中在奇数位置将节点向下遍历最后要记得将尾节点置空Linklist Create(Linklist &A).原创 2021-06-02 00:24:58 · 1416 阅读 · 2 评论 -
每日一题———15.寻找两个链表的公共节点(双指针线性实现)
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出链表图要点链表的遍历链表的数据查找尾插法(留尾链)思想(双指针线性查找)设置两个链表指针,让两个链表节点一起遍历当两个指针结束的时候相同,说明节点一致,否则说明不一样但是两个链表的长度不一致,故可以让长的链表先遍历k(两个链表的长度差),然后两个链表的长度就一致,接下去遍历到的相同就是节点一样的情况LNode * SerachCommen(Linklist La,Linklis.原创 2021-06-02 00:00:08 · 203 阅读 · 0 评论 -
每日一题———14.寻找两个链表的公共节点(暴力破解)
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出链表图要点链表的遍历链表的数据查找思想(暴力破解)嵌套遍历,来逐个比较节点,在第一个节点一致的时候返回该节点,否则,继续比较,在一个链表遍历完后要重新赋值,使其从头开始比较LNode * SerachCommen(Linklist La,Linklist Lb){ LNode *p=La->next; LNode *q=Lb->next; while(p != N.原创 2021-06-01 00:07:58 · 447 阅读 · 5 评论 -
每日一题———13.删除链表中的区间值
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目设在一个带头节点的单链表中所以的元素节点值无序,要求删除表中的数据小于y,大于x的值的节点要点链表的遍历链表的数据删除思想遍历链表,找到满足条件的节点,将其删除要利用两个指针,一个用作遍历,一个用做记录删除的时候节点的前驱void Delete(Linklist &L,int x,int y){ LNode *pre=L,*p=pre->next,*min; .原创 2021-05-31 01:04:45 · 358 阅读 · 0 评论 -
每日一题———12.链表的头插法和尾插法建立链表
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目链表的头插法建立链表要点链表的头插法头节点的建立头节点不能断链思想先分配内存空间建立一个头节点获取输入的数据,在输入的值为-1的时候终止链表的建立节点赋值,节点指向头节点的下一个位置,然后头节点指向插入的节点(关键)LinkList linkHead_Insert(LinkList &L){ Lnode *p; int val; L = (Lnode *)ma.原创 2021-05-30 00:26:06 · 183 阅读 · 0 评论 -
每日一题———11.删除单链表中的最小值的结点
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目编写一个算法实现在带头结点单链表L中删除最小值结点的算法要点链表的遍历链表结点的删除思想先是链表的遍历,这里需要用到两个指针,一个用作遍历链表,一个记录遍历指针的前驱结点信息在找到最小值的时候对数据进行删除,需要一个指针记录当前最小值的结点,因为要删除该节点,所以还需要一个前驱节点来方便删除的实现在扫描过程中,如果遍历指针中的值 < 最小节点的值,则将该值赋给最小结点,记录.原创 2021-05-29 01:44:15 · 1315 阅读 · 2 评论 -
每日一题———10.数组中区间数据的逆置
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出## 题目已知一维数组A[m+n]中依次存放两个线性表(a1,a2...am)和(b1,b2...bn)要求将这两个顺序表的位置互换即(b1,b2..bn)在(a1,a2...am)前面要点顺序表的数据逆置思想将前m个数据逆置将n个数据逆置整体数据逆置void Reverse(int A[],int m,int n,int size){ if(m >= n || n >.原创 2021-05-28 00:10:17 · 114 阅读 · 0 评论 -
每日一题———9.从有序表中删除值重复的元素
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出要点顺序表的遍历顺序表的元素删除思想因为是顺序表所以出现重复的元素总是相邻的借助两个变量i,j实现,i用于记录不重复的元素,j用与相邻元素比较bool delSame(Sqlist &L){ if(L.length == 0) return flase; int i,j; for(i=0,j=1;i<L.length;i++,j++){ if(L.data[.原创 2021-05-27 01:03:02 · 142 阅读 · 0 评论 -
每日一题———7.删除顺序表中值为s~t(s<t)的数据
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出要点顺序表的遍历顺序表数据的删除思想遍历顺序表,记录下不在区间的数据个数k只有不在区间的时候数据才加入到数组中k的长度就是操作过后的顺序表的长度(+1)bool delete(Sqlist &L,int s,int t){ if(L.length == 0 || s > t) return false; int k = 0; //保存保留元素后的数组下标 f.原创 2021-05-26 23:07:49 · 195 阅读 · 1 评论 -
每日一题———6.合并两个顺序表为一个有序顺序表
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出要点数据的比较和合并思想利用三个变量代表三个顺序表中元素的个数当被操作的两个元素个数都小于原来长度时进行比较,对目标顺序表添加数据存在A数据未添加完的情况,将A数据依次添加带目标顺序表中存在B数据未添加完的情况,将B数据依次添加带目标顺序表中bool merge(Sqlist A,Sqlist B,Sqlist &C){ int i=0,j=0,k=0; //判断要顺序表.原创 2021-05-26 00:27:25 · 215 阅读 · 0 评论 -
每日一题———5.删除单链表中数据为x的节点(x不唯一)
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出要点链表的删除思想需要借助三个指针,一个用作遍历的推行(比较指针),一个用作暂时保存要被删除的数据(删除指针),一个用作删除遍历节点的前驱节点(前驱指针)void deleteAll(LinkList &L,ElemType x){ LinkNode *p,*q,*pre; p=L->next; pre=L; while(p != NULL){ if(p->.原创 2021-05-26 00:08:07 · 179 阅读 · 0 评论 -
每日一题———4.删除顺序表中的重复数据(有多个)
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出要点顺序表中数据的查找思想思想1:遍历顺序表,记录表中值不为x的个数,在值不为x的时候才加入顺序表,这样子就间接达到了删除所有值为x的目的思想2:遍历顺序表,记录x的个数(k),将其中x的数据向前移动k(相当于删除)void delete_x(Sqlist &L,ElemType x){ int k=0; //记录表中非x的个数 for(int i = 0; i < .原创 2021-05-25 23:50:08 · 166 阅读 · 0 评论 -
每日一题———3.指定结点的二叉树层次
前言数据结构每日一题 声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出题目二叉树采用链式存储,求出指定结点在二叉排序树中的层次要点二叉树的形式(左子树<根结点<右子树)思想利用递归的思想将节点中的值和所求结点的值进行比较小于在左子树中寻找,大于在右子树中寻找数量+1int level(BTNode *bt,BTNode *p){ int count=1; BTNode *temp=bt; //临时结点用作对结点的操作 while.原创 2021-05-25 00:01:01 · 909 阅读 · 2 评论 -
每日一题———2.单链表的逆置(头插法实现)
单链表的逆置(头插法实现)void reverse(LinkLinst *H){}原创 2021-05-24 20:11:47 · 780 阅读 · 2 评论 -
每日一题———1.判断是否是平衡二叉树
每日一题原创 2021-05-24 00:54:40 · 111 阅读 · 0 评论