数据结构考研必背算法5星.docx

上传人:b****8 文档编号:10861272 上传时间:2023-02-23 格式:DOCX 页数:18 大小:76.17KB
下载 相关 举报
数据结构考研必背算法5星.docx_第1页
第1页 / 共18页
数据结构考研必背算法5星.docx_第2页
第2页 / 共18页
数据结构考研必背算法5星.docx_第3页
第3页 / 共18页
数据结构考研必背算法5星.docx_第4页
第4页 / 共18页
数据结构考研必背算法5星.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

数据结构考研必背算法5星.docx

《数据结构考研必背算法5星.docx》由会员分享,可在线阅读,更多相关《数据结构考研必背算法5星.docx(18页珍藏版)》请在冰豆网上搜索。

数据结构考研必背算法5星.docx

数据结构考研必背算法5星

数据结构考研必背算法5星

文档说明:

本文档是针对考研专业课《数据结构》所编写

的,是对考研数据结构的核心算法进行总结,我们知道,

不管是统考还是非统考,都会涉及至少10分的算法题(非

统考至少25分),而这些题的答案都是在一些经典算法的

思想上进行改进的,本文总结出必须要熟练掌握的算法,这些算法不管是考研初期还是冲刺,都应该高度重视,只要对这些代码进行熟练掌握,才能随机应变,希望对大家有所帮助;

线性表

1.逆转顺序表中的所有元素voidReverse(intA[],intn){inti,t;

for(i=0;i

}

}

自我总结:

3.删除不带头结点单链表L中所有值

为X的结点(递归)

voidDel_X(Linklist&L,ElemtypeX){

LNode*p;

if(L==NULL)

return;

if(L->data==X){

P=L;

L=L->next;

free(p);

Del_X(L,X);

}else{

Del_X(L->next,X);

}

自我总结:

2.删除线性表中数据域为X的所有结

点;

voidDel_X(Linklist&L,ElemtypeX){

Linklistp,q=L;

p=L->next;

while(P!

=NULL){

if(p->data==X){

q->next=p->next;

free(p);

p=q->next;

}else{

q=P;

P=p->next;

}

}

if(L->data==X){q=L;

L=L->next;free(q);

4.删除带头结点单链表L中所有值为

X的结点

voidDel_X(Linklist&L,ElemtypeX){LNode*p=L->next,*pre=L,*q;while(P!

=NULL){

if(P->data==X){

q=p;

p=p->next;pre->next=p;

free(q);

}else{

pre=p;

p=p->next;

}

}

自我总结:

注:

本算法是在无序单链表中删除满足某种条件的所有结点;如:

若是要删除介于max和min之间的所有结点,只需将if语

句改为if(p->data>min&&p->data

自我总结:

 

}

自我总结:

5•逆转线性表(不带头)

voidreverse(Linklist&L){

Linklistp,q,r;

p=L;

q=NULL;

while(p!

=NULL){

r=q;q=p;

p=p->next;q->next=r;

}

L=q;

}

带头结点:

Linklistreverse(LinklistL){

LNode*pre,*p=L->next,*r=p->next;p->next=NULL;

while(r!

=NULL){

pre=p;

p=r;

r=r->next;p->next=pre;

}

L->next=p;returnL;

}

自我总结:

7.将两个按值有序排列的非空线性表合并为一个按值有序的线性表

LinklistMergelist(LinklistL1,LinklistL2){

LinklistL3,p=L1,q=L2,r;if(L1->data<=L2->data){L3=L1;

r=L1;

p=L1->next;

}else{L3=L2;

r=L2;

q=L2->next;

}

while(P!

=NULL&&q!

=NULL){

if(p->data<=q->data){

r->next=p;

r=p;p=p->next;

}else{

r->next=q;

r=q;q=q->next;

}

}

r->next=p!

=NULL?

p:

q;returnL3;

6■复制线性链表(递归)

Linklistcopy(Linklistlist1){

自我总结:

Linklistlist2;if(list1==NULL)returnNULL;

else{

list2

(Linklist)malloc(sizeof(LNode));

list2->data=list1->data;

list2->next=copy(list1->next);returnlist2;

8.将两个按值递增线性表合并为一个

}

按值递减的线性表

voidMergeList(LinkList&L1,LinkList

&L2){

LNode*r,*p仁L1->next;*p2=L2-

>next;

L1->next=NULL;

while(p1&&p2){

if(p1->data<=p2->data){

r=p1->next;

p1->next=L1->next;

L1->next=p1;

p1=r;

}else{

r=p2->next;

p2->next=L1->next;

L1->next=p2;p2=r;

}

if(p1){

p2=p1;

}

while(p2){

r=p2->next;

p2->next=L1->next;

L1->next=p2;

p2=r;

}

1■先序遍历(递归)

voidPreOrder(BiTreeT){

if(T!

=NULL){

visit(T);

PreOrder(T->lchild);

PreOrder(T->rchild);

free(L2);

 

}

自我总结:

2■中序遍历(递归)

voidInOrder(BiTreeT){if(T!

=NULL){

InOrder(T->lchild);Visit(T);

InOrder(T->rchild);

中序遍历(非递归)

voidInOrder(BiTreeT){

InitStack(S);

BiTreep=T;

while(pll!

IsEmpty(S)){if(p){

Push(S,p);

}

p=p->lchild;

}

}

}

else{

}

Pop(S,p);

自我总结:

Visit(p);

p=p->rchild;

}

}

}

4.层序遍历(自上而下,自左至右)

自我总结:

voidLevelOrder(BiTreeT){

3.后序遍历(递归)

voidPostOrder(BiTreeT){if(T!

=NULL){

PostOrder(T->lchild);

PostOrder(T->rchild);Visit(T);

InitQueue(Q);

BiTreep;

EnQueue(Q,T);while(!

IsEmpty(Q)){

DeQueue(Q,p);

Visit(p);

if(p->lchild!

=NULL)

EnQueue(Q,p->lchild);

if(p->rchild!

=NULL)

EnQueue(Q,p->rchild);

}

}

后序遍历(非递归)

voidPostOrder(BiTreeT){

InitStack(S);

BiTreep=T;

r=NULL;

while(p||!

lsEmpty(S)){if(p){

Push(S,p);p=p->lchild;

}else{

GetTop(S,p);

if(p->rchild&&p-

p=p->rchild;Push(S,p);

p=p->lchild;

}else{

Pop(S,p);Visit(p);

r=p;

p=NULL;

}

}

自我总结:

5.层序遍历(自下而上,自右至左)

}

while(lsEmpty(S)==false){

Pop(S,p);visit(p->data);

}

}

自我总结:

last=rear;

}

}

returnlevel;

}

自我总结:

 

6.求二叉树深度(高度)

intBtdepth(BiTreeT){if(T==NULL)return0;

Ldep=Btdepth(T->lchild);rdep=Btdepth(T->rchild);if(ldep>rdep)returnIdep+1;

else

returnrdep+1;

(递归)

7.交换二叉树中所有结点的左右子树位置(递归)

voidswap(BiTreeb){if(b){

swap(b->lchild);swap(b->rchild);temp=b->lchild;b->lchild=b->rchild;b->rchild=temp;

}

注:

求某一层结点个数,每一层结点个数,树的最大宽度等,都采用此思想

自我总结:

非递归

求二叉树深度(非递归)

intBtdepth(BiTreeT){

if(!

T)

return0;

intfront=-1,rear=-1;intlast=0,level=0;BiTreeQ[MaxSize];Q[++rear]=T;

BiTreep;

while(frontlchild)

Q[++rear]=p->lchild;if(p->rchild)

Q[++rear]=p->rchild;iffront==last){

level++;

#defineMAX_QUEUE50

voidswap(BiTreeT){

BiTreeQUEUE[MAX_QUEUE]temp,p=T;

intfront,rear;

if(T!

=NULL){

QUEUE[0]=T;

front=-1;

rear=0;

while(front

p=QUEUE[++front];temp=p->lchild;

p->lchild=p->rchild;p->rchild=temp;

if(p->lchild!

=NULL)

QUEUE[++rear]=p-

>lchild;

>rchild;

if(p->rchild!

=NULL)

QUEUE[++rear]=p-

 

自我总结:

}

}

自我总结:

 

8.删除二叉树中以某个结点为根结点的子树

BiTreeCreate(){

charch;

BiTreeT;scanf("%c",&ch);

if(ch=='')

returnNULL;

else{

}

}

自我总结:

voidDeleteXTree(BiTreebt){if(bt){

DeleteXTree(bt->lchild);DeleteXTree(bt->rchild);free(bt);

voidSearch(BiTreebt,ElemTypeX){if(bt){

if(bt->data==X){DeleteXTree(bt);exit(0);

}

initQueue(Q);

EnQueue(Q,bt);while(!

lsEmpty(Q)){

DeQueue(Q,p);

if(p->lchild)

if(p->lchild-

9.建立二叉树(从键盘输入数据,先序遍历递归算法)

T=(BiTree)malloc(sizeof(BTNode));

T->data=ch;

T->lchild=Create();

T->rchild=Create();returnT;

>data==X){

>lchild);

>rchild);

}

p->rchild=NULL;}else

EnQueue(Q,p-

法二:

BiTreeCreateBT(intA[],intn){

inti;

BiTree*PT;

for(i=1;i<=n;i++){

if(A[i]!

=0){

PT[i]=(BiTree)malloc(sezeof(BTNode));

PT[i]->data=A[i];

}else{

PT[i]=NULL;

}

}

for(i=1;i<=n;i++){

if(PT[i]!

=NULL){

PT[i]->lchild=PT[2*i];

PT[i]->rchild=PT[2*i+1];

}

}

自我总结:

}

}

}

自我总结:

查找

1■顺序查找:

typedefstruct{

ElemType*elem;

intTableLen;

}SSTable;

intSearch_Seq(SSTableST,ElemTypekey){

ST.elem[0]=key;

for(i=ST.TableLen;ST.elem[i]!

=key;--

11.求结点所在的层次:

#defineMAXSTACK50

i);

returni;

intLayerNode(BiTreeT,intitem){BiTree

}

递归

 

intSeqSearch(intA[],intn,intkey,inti){if(i>=n)return-1;if(A[i]==key)returni;

elsereturnSeqSearch(A,n,key,i+1);}

调用:

Pos=SeqSearch(A,n,key,0);

总结:

2■折半查找:

intBinary_Search(SeqListL,ElemType

key){

intlow=0;high=L.TableLen-1,mid;while(low<=high){

mid=(low+high)/2;if(L.elem[mid]==key)returnmid;

elseif(L.elem[mid]>key)

自我总结:

high=mid-1;else

low=mid+1;

1);

else

returnmid;

}

return-1;

}

递归

typedefstruct{

ElemType*elem;

intlength;

}SSTable;

intBinSearchRec(SSTableST,ElemTypekey,intlow,inthigh){

if(low>high)return0;mid=(low+high)/2;if(key>ST.elem[mid])

BinSearchRec(ST,key,mid+1,high);elseif(key

BinSearchRec(ST,key,low,mid-

4.在按值递增排列且长度为n的线性表中

折半查找值不小于key的最小元素

voidBinSearch(intA[],intn,intkey){

intlow=0,high=n-1,mid;

while(low<=high){

mid=(low+high)/2;

if(key==A[mid])

returnmid;

if(key>A[mid])

returnmid+1;

else

high=mid-1;

}

if(low<=n-1)returnlow;

else

return-1;

自我总结:

}

自我总结:

n的线性表中

3•在按值递归排序且长度为折半查找并插入一个元素

voidBininsert(intA[],intn,intkey){intj,low=0,high=n-1,mid;while(low<=high){mid=(low+high)/2;if(key>A[mid])low=mid+1;

else

high=mid-1;

}

for(j=n;j>low;j--)

A[j]=A[j-1];

A[low]=key;

n++;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1