数据结构
数据结构基础算法
Xulidanga
这个作者很懒,什么都没留下…
展开
-
数据结构-树-判断一棵二叉树是否为二叉平衡树
1.算法思想根据二叉平衡树的性质,先判断递归判断左右子树是否为二叉平衡树,随后判断左右子树的高度差是否大于22.实现代码int IsBalance(BiTree T){ //空树为二叉平衡树 if(T==NULL) return 1; //递归判断左右子树是否均为二叉平衡树 int lbalance = IsBalance(T->lchild); int rbalance = ISBalance(T->rchild); if(rbalance == 0 || lbalanc原创 2020-10-19 16:40:02 · 142 阅读 · 0 评论 -
数据结构-树-二叉树的前序,中序,后序及层次遍历
一.算法思想二.源代码//1.递归前序遍历void PreOrder(BiTreeNode BT) { if (BT!=NULL) { Visit(BT); //先访问根节点 PreOrder(BT->Lchild); //递归遍历左子树 PreOrder(BT->Rightchild); //递归遍历右子树 }}//2.递归中序遍历void InOrder(BiTreeNode BT) { if (BT != NULL) { PreOrder(BT->L原创 2020-10-10 16:29:13 · 143 阅读 · 0 评论 -
数据结构-栈&树-中缀表达式转后缀表达式
实现方法:(1)参考:添加链接描述(2)①中缀表达式转化成二叉树(中缀表达式就是二叉树的中序遍历)②对二叉树进行后序遍历即可得到后缀表达式原创 2020-10-05 20:36:36 · 123 阅读 · 0 评论 -
数据结构-栈&链表-判断单链表是否中心对称
一.算法思想思路一:借助栈来实现本算法,首先将链表中前一半的元素进栈。在处理链表后一半元素时,当访问到链表的一个元素时,就从栈中弹出一个元素,并进行比较;若值相等,则继续往下比较,直到链表到尾。若这时栈是空栈,则可以得出该链表中心对称。若比较过程中有元素不相等或链表到尾时栈并不是空栈,则该链表为非中心对称(如xxyxx中心对称)思路二:将单链表的元素全部进栈,然后依次与单链表进行比较,直到比较到链表L为止,该算法与第一个算法相比实现起来较简单,但需要扫描两次单链表,效率较低。二.源代码//判断链表数原创 2020-10-02 21:20:55 · 3775 阅读 · 2 评论 -
数据结构-栈-链栈基本操作(带头结点及不带头结点)
一.数据类型声明#include<stdio.h>struct LQNode { //结点结构体 int data; //数据域 Node next; //指针域};typedef LQNode * Node; //结点结构体指针变量typedef Node List; //结点结构体头指针变量二.带有头结点的链栈基本操作/*带头结点的链栈*///1.初始化void initStack(List list) { list = new LQNode; //把结点结构体原创 2020-10-01 16:35:37 · 6492 阅读 · 1 评论 -
数据结构-链表-设A,B分别为两个递增有序的链表,设计一个算法从A和B中的公共元素产生单链表C,要求不破坏A,B的结点
一.算法思想因A,B都有序,故可以从第一个元素开始依次比较A,B两个表中的元素。若值不等,则值小的指针往后移;若值相等,则创建一个与该值相等的结点,使用尾插法插入到新的链表中,并将两个原表往后移,直到其中一个链表遍历到表尾二.源代码void Get_Common(List A,List B){ /*pa,pb分别为A,B的工作结点;s,r分别为新创建的结点及C链的尾指针*/ Node pa,pb,s,r; List C = new LNode; r = C; pa = A->next;原创 2020-09-30 15:56:42 · 1313 阅读 · 0 评论 -
数据结构-链表-将两个递增的链表归并为一个递减的链表
一.算法思想实现思路与在顺序表中合并两个递增的有序表类似,递减可由头插法来实现二.源代码void MergeList(List La,lList Lb){ Node pa,pb,r; pa = La->next; pb = Lb->next; La->next = Null;//将La作为结果链表的头指针 while(pa&&pb){ if(pa->data < pb->data){ r = pa->next;//r暂存pa原创 2020-09-30 15:31:14 · 2054 阅读 · 3 评论 -
数据结构-链表-删除链表中重复的元素
一.算法思想采用直接排序的思想,将链表中的第一个元素看作无重复序列中的第一个元素,随后通过工作指针P,将无重复序列中的最后一个元素的值与P所指的结点的值进行对比。若相等,则删除该结点,同时P指向下一个结点;若不相等,则将该结点加入到无重复序列中,并将该结点作为无重复序列的最后一个元素(其实就是不用删除该结点,P直接指向下一个结点)二.源代码void Del_Same(List list){ Node p,rear,temp; //temp为辅助指针,rear为无重复序列的最后一个元素结点指针 re原创 2020-09-30 15:01:22 · 811 阅读 · 0 评论 -
数据结构-链表-反向输出链表的值
一.算法思想**方法一:**利用递归的思想,将链表反向的值反向输出**方法二:**借助栈,将链表的值按顺序压入栈中,然后再输入栈中的值二.源代码方法一.//从尾到头输出单链表中的值void ReversePrint(List list) { if (list!=NULL) { ReversePrint(list->Next); //递归 } else return; printf("%d",list->Data); //输出值}方法二. 略...原创 2020-09-28 16:18:17 · 769 阅读 · 0 评论 -
数据结构-链表-删除所有值为x的结点
一.算法思想算法中共需要用到3个指针变量,分别为p,pre,temp。这三个指针变量代表的分别是:指向当前结点指针变量,当前结点的前一个结点的指针变量,辅助指针变量(用于删除值为x的结点)二.源代码void Delete_x(List list,ElementType x) { Node p,pre,temp; p = list->Next; pre = list; while (p!=NULL) { //若当前结点值等于x if (p->Data==x) { t原创 2020-09-28 16:03:14 · 4209 阅读 · 2 评论 -
数据结构-顺序表-序列中位数
一.问题描述一个长度为L(L>=1)的升序序列S,处在[L/2]个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15,两个序列的中位数是含它们所有元素的升序序列的中位数。列如S2=(2,4,6,8,20),则S1,S2的中位数是11。现有两个等长序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数二.算法思想将两个有序顺序表合成为一个有序顺序表,然后再求新的顺序表的中位数即可三.源代码int M_Search(i原创 2020-09-25 15:57:05 · 1141 阅读 · 1 评论 -
数据结构-顺序表-将一维数组R向左移P个位置
一.算法思想思路一:例如数组[1,2,3,4,5],想左移动3个位置,移动之后的数组变为[4,5,1,2,3]。这时,如果我们用a代表1,2,3,用b代表4,5。那么就可以看成数组[a,b]变为了数组[b,a]。那么问题就变成了:如何将[a,b]变为[b,a]? 首先将a逆置,变为[a逆置,b],然后再将b逆置,变为[a逆置,b逆置],最后将整个数组逆置就变为了[b,a] (这里可能需要用到一些线性代数的知识)思路二:借助辅助数组temp,将数组R中前P个元素放入temp中,随后将后面的元素左移,最后原创 2020-09-25 15:26:16 · 382 阅读 · 0 评论 -
数据结构-顺序表-将数组A[M+N]中的(a1-am),(b1-bn)逆置
一.算法思想算法主要分为三部分:①将整个顺序表逆置,即将数组A[a1-bn]逆置为A[bn,bn-1…b1,am,am-1,am-2…a1] 。②将A的前N项A[bn-b1]逆置。 ③将A的后m项A[am-a1]逆置。二.源代码//算法主函数void Exchange(List list,int m,int n,int arraySize) { Reverse(list,0,m+n-1,arraySize); //整个表先逆置 Reverse(list, 0, n-1, arraySize);原创 2020-09-24 15:24:59 · 246 阅读 · 0 评论 -
数据结构-顺序表-删除重复的值
一.算法思想采用类似于插入排序的思想,将数组的第一个元素视为非重复的有序表,之后依次判断后面的元素是否与前面的元素重复,若不重复则插入到前面非重复有序表的最后,反之则继续往后判断二.源代码//有序顺序表中删除值重复的元素void WangDao6DeleteRepeatElement(List list) { int i, j; //i用来储存第一个不相同的元素,j为工作指针(即一直往后扫描) if (list->Last==-1) { printf("顺序表为空"); } for原创 2020-09-23 17:05:35 · 2062 阅读 · 1 评论 -
数据结构-顺序表-从顺序表中删除其值在给定值s与t之间的所有元素(s<t,顺序表不一定有序)
一.算法思想从数组开始往后扫描不在(s,t)之间的元素,边扫描边统计K,同时将不在(s,t)之间的元素往前移K个位置,最后修改顺序表的长度,实现删除顺序表L中所有不在(s,t)之间的元素二.源代码//删除顺序在给定值S和T之间(s<t)的所有元素void WangDao5DeleteS_T2(List list, int s, int t) { int k = 0; //记录不在S-T之间元素的个数 if (s >= t || list->Last == -1) { pri原创 2020-09-23 16:47:55 · 878 阅读 · 0 评论 -
数据结构-顺序表-从有序顺序表中删除其值在给定值s与t之间的所有元素(s<t)
一.算法思想通过遍历顺序表确定第一个大于s的元素的下标i,随后从i出发遍历确定第一个大于t的元素下标j。最后将大于t的元素往前移。二.源代码//删除有序顺序表在给定值S和T之间(s<t)的所有元素void DeleteS_T(List list, int s, int t) { //注:该顺序表为有序表 int i, j; if (s >= t || list->Last == -1) { printf("S,T的取值有误或表为空"); } //找第一个大于s元素的下原创 2020-09-23 16:30:57 · 2025 阅读 · 0 评论 -
数据结构-顺序表-删除表中所有值为x的元素
一.算法思想从数组开头往后扫并用K记录不等于X的元素个数,且边扫描边统计K,同时将不等于X的元素往前移K位,最后修改顺序表的长度,实现删除顺序表L中所有值为X的元素二.源代码//删除值为X的数据元素void Del_X(List list,ElementType x) { PrintList(list); int k = 0; //记录K不等于0的个数 for (int i = 0; i <= list->Last;i++) { if (list->Data[i] !=原创 2020-09-23 15:59:47 · 5421 阅读 · 0 评论 -
数据结构-顺序表-将顺序表所有元素逆置,且要求空间复杂度为O(1)
一.算法思想根据题目的要求,将顺序表中的元素上半部分及下半部分的元素通过变量temp进行逆置二.源代码//逆置顺序表void Reverse(List list) { int temp = 0; //辅助变量 /*转置前的数组*/ PrintList(list); /*算法思想:将顺序表的前半部分与后半部分进行交换,故需用到temp辅助变量 注: 因list->last为顺序表的下标,故list->last/2为奇数和偶数时处理方式不同 即list->last原创 2020-09-23 15:30:58 · 2059 阅读 · 0 评论 -
数据结构-顺序表-删除最小值元素(假设唯一)
一.算法思想①通过比较找出最小值元素的值及其下标,并分别用变量保存起来②用顺序表中最后一个元素覆盖最小值元素,并使顺序表的长度减一二.源代码//删除最小元素ElementType WangDao1DeleteMinNumber(List list) { int min = 9999; //表示最小值的值,初始值为9999 int index = 0;//表示最小值的下标,初始值为0 //list->Last表示的是数组的下标 if (list->Last == -1) {原创 2020-09-23 15:17:26 · 1289 阅读 · 0 评论 -
数据结构-树-通过前序遍历与中序遍历创建二叉树
一.算法思想关于通过前序遍历与中序遍历来创建二叉树,相信大家都用手工的方法推出来过,所以这里的算法思想就略过了。二.源代码BiTreeNode CreateBt(ElementType A[],ElementType B[],int PreL,int PreR,int InL,int InR) { //A,B两个数组存放前序和中序遍历的结果,且数组下标从1开始 //PreL,PreR,InL,InR分别为前序,中序的第一个以及最后一个结点下标 BiTreeNode BT; BT = new B原创 2020-07-07 17:24:59 · 260 阅读 · 0 评论 -
数据结构-树-求二叉树高度(递归与非递归)
一.算法思想(1)非递归主要采用层次遍历的算法,并设置变量height与last,其中height记录数的高度,而last则指向某一层在队列中最后一个结点的序号,每次在队列出队时与队列的队头序号front作比较,如果last==front,则代表last所指那一层的结点已全部遍历完,此时height+1(2)递归递归的算法比较简洁,主要是从树的最后一层开始计算,即计算二叉树的深度,而二叉树的深度等于二叉树的高度二.源代码(1)非递归//1.非递归求解二叉树高度int BtDepth(BiTr原创 2020-07-07 16:37:18 · 3707 阅读 · 1 评论 -
数据结构-树-中序线索二叉树的构造及遍历
一.中序线索二叉树的构造(1)算法思想所谓二叉树的线索化就是将二叉链表中的空指针改为指向前驱或者后驱的线索。而前驱和后驱的信息只有在遍历时才能得到,所以二叉树的线索化是在遍历的过程中同时进行的。故有前序,中序,后序线索二叉树,而这都跟二叉树的前序,中序,后序遍历一一对应。并且规定:若某个结点无左子树,则令其lchild指向其前驱结点;若无右子树,则令其rchild指向其后继结点。那么其中中序线索二叉树的构造如下图所示根据中序遍历,我们可以知道,第一个访问的结点为B。而这时B的左右子树都为空,所以令其l原创 2020-07-03 18:04:32 · 4919 阅读 · 4 评论 -
数据结构-树-已知二叉树按顺序结构进行存储,求编号分别为i,j结点的公共祖先
1.算法思想若i>j,则先求i的父结点i/2。若 i/2 = j,则说明结点i及结点j的公共父结点为i/2。若i/2 != j,则令i = i/2,并继续进行循环,直到出现i=j的情况。那么j>i的情况与之类似2.实现代码①递归实现ElementType Comm_Ancestor(SqTree T,int i,int j){ if(i==j){ //递归出口 return T[i]; } else if(i>j){ i = i/2; Comm_Ancestor(原创 2020-07-01 17:07:43 · 2109 阅读 · 2 评论 -
数据结构-树-在一棵度为4的树T中,若有20个度为4的节点,10个度为3的节点,1个度为2的节点,10个度为1的节点,则树T的叶节点个数
1.基本概念度:树中某个结点的子节点个数树的度:树中结点的最大度数树中总结点数:所有结点的度数+1(加1是因为根结点没有父结点)2.计算思路树中总结点数:所有结点的度数+1 = 204+103+1*2+10+1 = 123而又因为树中总结点数 = 树中度为0的结点数 + 树中度为1的结点数 + 树中度为2的结点数 + 树中度为3的结点数 + 树中度为4的结点数。而叶节点数则为树中度为0的结点数,故叶节点数 = 123-10-1-10-20 = 82...原创 2020-06-29 17:38:00 · 13372 阅读 · 0 评论 -
数据结构-KMP算法
图解KMP转载 2020-06-28 16:59:28 · 122 阅读 · 0 评论 -
数据结构-中缀表达式转化后缀表达式
算法思想:从左向右开始扫描中缀表达式,遇到数组时,加入后缀表达式,遇到运算符时:①若为’(’,入栈 。②若为’)’,则依次把栈中的运算符加入后缀表达式,直到出现’(’,并从栈中删除’(’ 。③若为除括号外的其他运算符,当其他优先级高于除’('外的栈顶运算符时,直接入栈,否则从栈顶开始,依次弹出比当前处理的运算符优先级高和优先级相等的运算符,知道一个比它优先级低或遇到一个左括号为止。...原创 2020-06-23 16:32:41 · 161 阅读 · 0 评论 -
数据结构-链表-有一个带头结点的单链表L,设计一个算法使其元素递增有序
1.算法思想解法可分为两种:① 先将链表的数据复制到数组中,再采用时间复杂度为O(nlog2n)的算法进行排序,然后将数组元素依次插入到链表中② 采用直接插入排序的思想,将链表分为两条链,一条由头结点及一个数据结点构成,另一条由剩下的结点构成。然后依次扫描第二条链中剩下的结点,并通过比较插入到第一条链中去。下面的代码采用的是第二种的解法。2.源代码void LinkSort(List list) { Node pre, p, r; p = list->Next; //r保持*p后继结点原创 2020-06-11 16:55:35 · 9790 阅读 · 2 评论 -
数据结构-链表-就地逆置单链表
数据结构-就地逆置单链表1.算法思想对链表的处理可分为3步(1) 将首结点的Next域置空,即p->Next = NULL,原因是逆置后该结点变为尾结点(2)对于普通结点,用pre,p,r指向3个相邻的结点。令p->Next = pre,注意到一旦调整指针的指向后,p后继结点的链就会断开,为此需要用r来指向原p结点的后继结点。(3)将头结点的Next域设为尾结点,原始是逆置后该结点变为首结点2.源代码void Reverse(List list) { Node pre, p, r原创 2020-06-11 16:41:59 · 775 阅读 · 0 评论 -
数据结构-链表-递归删除不带头结点的单链表L中的所有值为X的结点
1.算法思想设f(L,x)函数的功能是删除以L为头指针的单链表中所有值为x的结点,那么很显然f(L->Next,x)的功能则是删除以L->Next为头指针的单链表中所有值为x的结点。并且有(1)若L空表,递归结束(2)若L->Data == x,那么删除L结点,且令L = L->Next,并执行f(L->Next,x)(3)以上两种情况都不满足,则直接执行f(L->Next,x)2.源代码void Recursion_Delete_x(List list,El原创 2020-06-10 15:20:46 · 795 阅读 · 1 评论 -
数据结构-顺序表基础算法
数据结构-顺序表删除最小值元素(王道考研)1.问题描述从顺序表中删除具有最小值的元素(假设唯一),并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行2.源代码(1)数据类型声明#include "stdio.h"#include <stdlib.h>//Position代表的是数组的下标,用整型表示typedef int Position;//ElementType为元素类型typedef int ElementType;//Ptr原创 2020-06-08 14:43:36 · 174 阅读 · 0 评论