您的位置:首页 > 其它

算法之有序表合并、二叉树遍历、图的遍历

2017-12-24 22:35 696 查看
  今天考了数据结构,仍然有好多没有记住的常见算法,先来四个学着。

算法是计算机领域里,最不容易被时代淘汰的知识啦,觉得不仅仅是为着当前的考试,也是未来的发展。

1.有序表合并

int a[20]={6,13,17,21,41,65,73};//a[0]中存储数组中元素个数
int b[20]={5,20,31,32,47,55};//b[0]中存储数组中元素个数
int c[100];//c[0]中存储数组中元素个数
int i=1;j=1;k=0;
while((i<=a[0])&&(j<=b[0]))
{
k++;
if(a[i]<b[j])
{
c[k]=a[i];
i++;
}else {
c[k]=b[j];
j++;
}
}
while(i<=a[0])
{
k++;c[k]=a[i];i++;
}
while(j<=b[0])
{
k++;c[k]=b[j];j++;
}
c[0]=a[0]+b[0];



2.二叉树的三种遍历

//结点数据结构
typedef struct node
{
int data;
struct node *l,*r;
}tree *btree

void pri1(btree t0)//先序
{
if(t0)
{
printf("%d",t0->data);
pri1(t0->l);
pri1(t0->r);
}
}
void pri2(btree t0)//中序
{
if(t0)
{
pri2(t0->l);
printf("%d",t0->data);
pri2(t0->r);
}
}
void pri3(btree t0)//后序
{
if(t0)
{
pri3(t0->l);
pri3(t0->r);
printf("%d",t0->data);
}
}




3.图的深度优先遍历

main()
{
int i,j,n,top,k,s;
int flag[20]={0};//标志,没访问的为0,访问过的为1
int stack[100];
int g[9][9]=//这里要手动输入图
scanf("%d",&s);//开始访问的结点
printf("%d",s);
flag[s]=1,stack[0]=s;//将已访问的元素沉底
top=0;
k=0;
n=8;//8个顶点
while(top>=0)//回溯操作
{
k++;
if(k>n)
{
k=stack[top];
top--;
}else if((falg[k]==0)&&(g[stack[top]][k])==1)
{
printf("%d",k);
flag[k]=1;
top++;
stack[top]=k;
k=0;
}
}
}




4.图的广度优先遍历

main()
{
int i,j,s,n,front,rear,x;
int flag[100]={0};
int q[100];
int g[9][9]=//图需要自己输入
scanf("%d",&s);
q[1]=s;
flag[s]=1;
n=8;
front=1;rear=1;
while(front<=rear)//队非空
{
x=q[front];front++
for(j=1;j<=n;j++)
if((flag[j]==0)&&(g[x][j])==1)
{
falg[j]=1;
rear++;
q[rear]=j;
}
}
for(i=1;i<=rear;i++)
printf("%d",q[i]);
getch();
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息