2020软件工程作业04
这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/2018SE/ |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/2018SE/homework/11406 |
这个作业的目标 | 实现两道算法 |
学号 | 20189609 |
算法1 区间k大数查询
1.1解题思路
写一个方法通过输入的数组根据起始和终点,获得新的数组进行排序,这里用的是冒泡排序,最后返回第k大的数值。
1.2解题代码
#include<stdio.h>
#include<stdlib.h>
void Sort(int* brr, int n)
{
int i , j ,temp;
for (i = 0; i < n - 1; i++){
for (j = 0; j < n - 1 - i; j++){
if (brr[j] < brr[j+1]){
temp = brr[j];
brr[j] = brr[j+1];
brr[j+1] = temp;
}
}
}
}
int Find(int arr[], int l, int r, int k)
{
int i = 0, j = 0;
int* brr;
brr = (int*)malloc(sizeof(int)*(r - l + 1));
for (i = l-1; i <= r-1; i++){
brr[j++] = arr[i];
}
Sort(brr, r - l + 1);
return brr[k - 1];
free(brr);
}
int main()
{
int n, i;
scanf("%d", &n);
int* arr = NULL;
arr = (int*)malloc(sizeof(int)*n);
if (arr == NULL){
printf("false\n");
exit(1);
}
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int m;
scanf("%d",&m);
int* crr = NULL;
crr = (int*)malloc(sizeof(int)*m);
i = 0;
int w = m;
while (m--)
{
int l, r, k;
scanf("%d%d%d", &l, &r, &k);
crr[i++]=Find(arr,l,r,k);
}
for (i = 0; i < w; i++)
{
printf("%d\n", crr[i]);
}
return 0;
}
算法2 二叉树的先、中、后 序遍历与层级遍历
2.1解题思路
在民政大二就开始学数据结构,看了好多学校的数据结构,我用的是C语言写的,先序中序后序通过递归调用,层序基本思想:按层次顺序遍历二叉树的原则是先被访问的结点的左、右儿子结点先被访问,因此,在遍历过程中需利用具有先进先出特性的队列结构。
2.2解题代码
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define MAXSIZE 30
typedef struct bitree{
char data;
struct bitree *Lchild;
struct bitree *Rchild;
}*Bitree,BiTree; //二叉树
typedef struct node{
Bitree data;
struct node *Next;
}NODE,*Node; //队列数据域
typedef struct{
Node front;
Node rear;
}QUEQUE,*QueQue; //队列指针域
Bitree Create_Bitree();//创建二叉树
void Create_Bitree_input(Bitree *root);//初始化二叉树
QueQue Create_QueQue();//创建队列
void INPUT_QUEQUE(QueQue A,Bitree root);//出队
int Empty_QUEQUE(QueQue A);//队列判空
void OUTPUT_QUEQUE(QueQue A,Bitree *root); //入队
void preorder(Bitree root);//先序递归遍历
void PostOrder(Bitree root);//后序递归遍历
void Inorder(Bitree root);//中序递归遍历
void Levelorder(Bitree root);//层次遍历
main()
{
Bitree root;
root=Create_Bitree();
Create_Bitree_input(&root);
preorder(root);//先序递归遍历
printf("\n");
Inorder(root);//中序递归遍历
printf("\n");
PostOrder(root);//后序递归遍历
printf("\n");
Levelorder(root);//层次遍历
printf("\n");
//ATDNB##4#9##51####6## 测试样例
}
Bitree Create_Bitree()//创建二叉树
{
Bitree root=(Bitree)malloc(sizeof(BiTree));
root->Lchild=root->Rchild=NULL;
return root;
}
void Create_Bitree_input(Bitree *root)//初始化二叉树
{
char ch;
ch=getchar();
if(ch=='#') *root=NULL;
else
{
(*root)=(Bitree)malloc(sizeof(BiTree));
(*root)->data=ch;
Create_Bitree_input(&((*root)->Lchild));
Create_Bitree_input(&((*root)->Rchild));
}
}
QueQue Create_QueQue()//创建队列
{
QueQue A=(QueQue)malloc(sizeof(QUEQUE));
Node B=(Node)malloc(sizeof(NODE));
B->Next=NULL;
A->front=A->rear=B;
return A;
}
void INPUT_QUEQUE(QueQue A,Bitree root)//出队
{
Node B;
B=(Node)malloc(sizeof(NODE));
B->data=root;
B->Next=NULL;
A->rear->Next=B;
A->rear=B;
}
int Empty_QUEQUE(QueQue A)//队列判空
{
if(A->front==A->rear)
return 1;
else
return 0;
}
void OUTPUT_QUEQUE(QueQue A,Bitree *root) //入队
{
Node B;
if(!Empty_QUEQUE(A))
{
B=A->front->Next;
A->front->Next=B->Next;
*root=B->data;
if(A->front->Next==NULL)
{
A->rear = A->front;
}
}
}
void preorder(Bitree root)//递归先序遍历
{
if(root)
{
printf("%c",root->data);
preorder(root->Lchild);
preorder(root->Rchild);
}
}
void Inorder(Bitree root)//中序递归
{
if(root)
{
Inorder(root->Lchild);
printf("%c",root->data);
Inorder(root->Rchild);
}
}
void PostOrder(Bitree root) //后序递归遍历
{
if(root)
{
PostOrder(root->Lchild);
PostOrder(root->Rchild);
printf("%c", root->data);
}
}
void Levelorder(Bitree root)//层次遍历
{
Bitree p;
QueQue A; //定义队列
A=Create_QueQue(); //创建队列
INPUT_QUEQUE(A,root); //入队
while(!Empty_QUEQUE(A)) //队列非空时
{
OUTPUT_QUEQUE(A,&p); //出队
printf("%c",p->data);
if(p->Lchild!=NULL) INPUT_QUEQUE(A,p->Lchild);//左孩子入队
if(p->Rchild!=NULL) INPUT_QUEQUE(A,p->Rchild);//右孩子入队
}
}