数据结构练习题

文章介绍了哈夫曼树的创建、二叉树操作以及图的拓扑排序,包含实验要求、代码实现和示例。
摘要由CSDN通过智能技术生成

树和二叉树;图的基本操作

我来了

精彩开始

 

 

 

12.哈夫曼树

实验三 哈夫曼树。实验目的及要求:1、要求学生掌握树和二叉树的基本概念;2、要求学生深刻理解二叉树的性质和存储结构,熟练掌握二叉树的遍历算法;3、认识哈夫曼树、哈夫曼编码的作用和意义;4、能够建立一个哈夫曼树,并输出哈夫曼编码,正确调试程序。本题要求实现一个创建哈夫曼树的函数,根据输入的n个结点的权值,创建一棵哈夫曼树。例如输入5 2 3 5 7 8,其中第一个数值5,表示5个结点,2 3 5 7 8分别表示这5个结点的权值,中间用空格分开,则该函数应该输出5(2,3),10(5,5),15(7,8),25(10,15),注意:生成的结点之间用“,”分开。

函数接口定义:

void CreatHuff(HuffmanTree *HT, int *w, int n);

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct
 {   
 int weight;         // 结点权值?   
 int parent, lc, rc; // 双亲结点和左 右子节点
} HTNode, *HuffmanTree; 
void Select(HuffmanTree *HT, int n, int *s1, int *s2)
{    
int minum,i;      // 定义一个临时变量保存最小值?    
for(i=1; i<=n; i++)     // 以下是找到第一个最小值    
{        if((*HT)[i].parent == 0)        
    
    {    minum = i;            
         break;        
    }   
 }    
for(i=1; i<=n; i++)   
 {       if((*HT)[i].parent == 0)           
         if((*HT)[i].weight < (*HT)[minum].weight)                
         minum = i;    
}   
 *s1 = minum;    // 以下是找到第二个最小值,且与第一个不同    
for( i=1; i<=n; i++)         
{       if((*HT)[i].parent == 0 && i != *s1)        
    {    minum = i;            
         break;        
    }    
}    
for( i=1; i<=n; i++)   
 {        if((*HT)[i].parent == 0 && i != *s1)           
          if((*HT)[i].weight < (*HT)[minum].weight)                
          minum = i;    
}    
*s2 = minum;
}
 void CreatHuff(HuffmanTree *HT, int *w, int n);
int main()
{    
    HuffmanTree HT;        
    int *w, n, wei,i;    
    //printf("input the number of node\n");    
    scanf("%d", &n);    
    //w = new int[n+1];   
    w=(int *) malloc ((n+1) * sizeof(int));
    //printf("\ninput the %dth node of value\n", n);     
    for(i=1; i<=n; i++)    
    {        
        scanf("%d", &wei);        
        w[i] = wei;    }    
    CreatHuff(&HT, w, n);       
    return 0;
}
/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

5 2 3 5 7 8

输出样例:

在这里给出相应的输出。例如:

5(2,3),10(5,5),15(7,8),25(10,15),
提交答案:
void CreatHuff(HuffmanTree *HT, int *w, int n)
{
	int m,i;
	int s1,s2;
	m=n*2-1;
	(*HT)=(HTNode *) malloc ((m+1) * sizeof(HTNode));
   for(i=1;i<=n;i++)	
   {
   	(*HT)[i].weight=w[i];
   	(*HT)[i].parent=0;
   	(*HT)[i].lc=0;
   	(*HT)[i].rc=0;
   }
   for(i=n+1;i<=m;i++)
   {
   	(*HT)[i].weight=0;
    (*HT)[i].parent=0;
   	(*HT)[i].lc=0;
   	(*HT)[i].rc=0;
   }

   for(i=n+1;i<=m;i++)
   {
   	Select(HT,i-1,&s1,&s2);
   	(*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;
   	(*HT)[s1].parent=i;
   	(*HT)[s2].parent=i;
   	(*HT)[i].lc=s1;
   	(*HT)[s2].rc=s2;
   	printf("%d(%d,%d),",(*HT)[i].weight,(*HT)[s1].weight,(*HT)[s2].weight);
   }
}

13.交换二叉树中每个结点的左孩子和右孩子

以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子。

输入格式:

输入二叉树的先序序列。

提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。

输出格式:

输出有两行:

第一行是原二叉树的中序遍历序列;

第二行是交换后的二叉树的中序遍历序列。

输入样例:

ABC##DE#G##F###

输出样例:

CBEGDFA

AFDGEBC

提交答案:
#include<stdio.h>

#define N 100

typedef struct node
{
	char data;
	struct node *l;
	struct node *r;
}*Bitree;

void inod(Bitree t);
void swapinod(Bitree t);

int main()
{
	Bitree T,t;
	T=t=(Bitree)malloc(sizeof(struct node));
	Bitree stack[N];
	int top=-1;
	char a[N];
	int i;
	
	scanf("%s",a);
	i=0;
	if(a[i]=='#')
	return 0;
	t->data=a[i];
	t->l=t->r=NULL;
	i++;
	stack[++top]=t;
	while(top>=0)
	{
		if(a[i]!='#')
		{
			t=(Bitree)malloc(sizeof(struct node));
			t->data=a[i];
			t->l=t->r=NULL;
			i++;
			stack[top]->l=t;	
			stack[++top]=t;
		}
		if(a[i]=='#')
		{
			while(a[++i]=='#')
			{
				top--;
			}
			if(top<0)
			{
				break;
			}
			t=(Bitree)malloc(sizeof(struct node));
			t->data=a[i];
			t->l=t->r=NULL;
			i++;
			stack[top]->r=t;
			top--;
			stack[++top]=t;
		}
	}
	inod(T);
	printf("\n");
	swapinod(T);
} 

void inod(Bitree t)
{
	if(t==NULL)
	{
		return;
	}
	inod(t->l);
	printf("%c",t->data);
	inod(t->r); 
}

void swapinod(Bitree t)
{
	if(t==NULL)
	{
		return;
	}
	swapinod(t->r);
	printf("%c",t->data);
	swapinod(t->l); 
}

14.图的基本操作-拓扑排序

1、要求学生理解和掌握图的基本概念;2、要求学生深刻理解图的主要的存储结构;3、掌握在邻接表存储结构下的图的深度优先遍历、广度优先遍历;4、掌握图的拓扑排序算法。本题要求根据程序中的图实现一个拓扑排序函数,无输入,直接输出拓扑排序结果,例如:A B C D E F (拓扑排序顶点序列,中间用两个空格间隔)。

函数接口定义:

在这里描述函数接口。例如:
void TopologicalSort(PGraph g)

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>

#define MAX_VERTEX_NUM 20

typedef struct 
{
    int vertexNum;
    char vertex[MAX_VERTEX_NUM];
    int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
}Graph,*PGraph;


void createdGraph(PGraph g)
{
    int i,j;
    g->vertexNum=6;
    for(i=0;i<g->vertexNum;i++)
        g->vertex[i]='A'+i;
      for(i=0;i<g->vertexNum;i++)
         for(j=0;j<g->vertexNum;j++)
                g->arc[i][j]=0;
      g->arc[0][1]=1;
      g->arc[0][2]=1;
      g->arc[0][3]=1;
      g->arc[1][4]=1;
      g->arc[2][1]=1;
      g->arc[2][4]=1;
      g->arc[4][3]=1;
      g->arc[4][5]=1;
}

/* 请在这里填写答案 */


int main()
{
    Graph graph;
    createdGraph(&graph);
    TopologicalSort(&graph);
}

输入样例:

无输入

输出样例:

在这里给出相应的输出。例如:

A  B  C  D  E  F  
提交答案: 
void TopologicalSort(PGraph g)
{
	int du[1010];
	int i,j,k;
	for(i=0; i<=100; i++)
		du[i]=0;
	for(i=0; i<g->vertexNum; i++)
	{
		for(j=0; j<g->vertexNum; j++)
		{
			if(g->arc[i][j])
				du[j]++;
		}
	}
	int flag=0;
	for(k=0; k<g->vertexNum; k++)
	{
		for(i=0; i<g->vertexNum; i++)
		{
			if(du[i]==0)
			{
				printf("%c  ",g->vertex[i]);
				for(j=0; j<g->vertexNum; j++)
				{
					if(g->arc[i][j])
					{
						g->arc[i][j]=0;
						du[j]--;
					}
				}
				du[i]=-1;
				break;
			}
		}
	}
}

15.邻接矩阵表示法创建无向图

采用邻接矩阵表示法创建无向图G ,依次输出各顶点的度。

输入格式:

输入第一行中给出2个整数i(0<i≤10),j(j≥0),分别为图G的顶点数和边数。
输入第二行为顶点的信息,每个顶点只能用一个字符表示。
依次输入j行,每行输入一条边依附的顶点。

输出格式:

依次输出各顶点的度,行末没有最后的空格。

输入样例:

5 7
ABCDE
AB
AD
BC
BE
CD
CE
DE

输出样例:

2 3 3 3 3
提交答案: 
#include<stdio.h>
int main(){
    int i,j,k,t,flag=0,b[73],G[10][10]={0};
    char ch,v1,v2;
    scanf("%d%d",&i,&j);
    getchar();//吞一个字符,消除回车影响
    for(k=0;k<i;k++){
    scanf("%c",&ch);
    b[ch]=k;//字母转换成对应数字
    }
    for(k=0;k<j;k++){
        getchar();
        scanf("%c%c",&v1,&v2);
        G[b[v1]][b[v2]]=G[b[v2]][b[v1]]=1;
    }
    for(k=0;k<i;k++){
        int num=0;
        for(t=0;t<i;t++){
            num+=G[t][k];
        }
        if(flag==0){printf("%d",num);flag=1;}
        else printf(" %d",num);
    }
    return 0;
}

  • 29
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值