机试(二)

1、

题目描述:

有一棵树,输出某一深度的所有节点 ,有则输出这些节点,无则输出EMPTY,该树是完全二叉树

输入描述:

输入有多组数据。每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d表示深度

输出描述:

输出该树中第d 层的所有节点,节点间用空格隔开,最后一个节点后没有空格

#include<iostream>
using namespace std;
int main()
{
    int a[1000];//用于存放输入的结点数组
    int n;//存放输入的节点数
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    int d;//用于存放输出的第d层                                
    cin>>d;  
    int m=d-1;
    int fact=1;
    while(m--)
    {
        fact=fact*2;
    }
    if((2*fact-1)<n)//说明第d层不是最后一层
    {
        for(int j=fact-1;j<2*fact-1;j++)
            cout<<a[j]<<" ";
        cout<<endl;
    }
    else//说明第d层是最后一层或者给的d值太大超过了树的深度
    {
		if(2*fact>n)
			cout<<"EMPTY";
		else
		{
            for(int j=2*fact-1;j<n;j++)
               cout<<a[j]<<" ";
            cout<<endl;
		}
    }
    system("pause");
    return 0;    
}

2、

题目描述

第一行输入一个数n,1<=n<=1000,下面输入n行数据,每一行有两个数,分别是x   y.输出一组x  y,该组中数据是所有数据中x最小的,且在x相等的条件下y最小。

输出描述:

输入有多组数据。每组输入n,然后输入n个整数对

输出描述:

输出最小整数对

 

分析:定义结构体node,用来存放每一组元素(x,y)。输入n组数据之后,先找到x最小的min值,再将对应于最小x的y值存储到数组b中,再在b中寻找最小的y值

#include<iostream>
using namespace std;
struct node
{
   int x;
   int y;
};
int main(){
	int n;//可以输入的行数
	int num1,num2;
   node A[1000];
   cin>>n;
   int b[1000];
   for(int i=0;i<n;i++)//依次输入n组数据
   {
     cin>>num1>>num2;
	 A[i].x=num1;
	 A[i].y=num2;
   }
   int min1=A[0].x;
   int j=0;
   for(int i=0;i<n;i++)//找到x最小的,赋值给min
   {
      if(A[i].x<min1)
	  {
         min1=A[i].x;
	  }
   }
   for(int i=0;i<n;i++)//对应的用数组b存储最小的x对应的y
   {
     if(A[i].x==min1)
		{ b[j]=A[i].y;
		   j++;
	    }
   }
   int min2=b[0];
   for(int k=j-1;k>=0;k--)//找到最小的y
   {
     if(min2>b[k])
		 min2=b[k];
   }
   cout<<min1<<" "<<min2;//输出对应的最小x和y
  system("pause");
   return 0;
}

3、约瑟夫环问题

题目描述:

N个人围成一圈顺序编号,从1号开始按1、2/2顺序报数,报3者退出圈外,其余的人再从1、2、3开始报数,报3的人再退出圈外,依次类推。请按退出顺序输出每个退出人的原序号。要求使用环形链表

输入描述:

输入第一行为整数m表示有m组测试数据,接下来m行每行一个整数N,N不超过50

输出描述:

输出m行,每行表示题目所求,用空格隔开

采用循环链表解决

  • 主函数中调用创建链表的函数,创建含有n个节点的链表
  • 输出函数循环条件是循环链表为空,否则两个指针不停地交替进行输出q=p->next;p=q->next,删除p
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
    int data;
    struct LNode* next;
}LNode;
LNode* create_list(int n)
{//创建循环链表,参数为n,先创建头结点,再依次创建后面的各节点,最终尾结点->next=头结点
    int i;
    LNode *head,*p,*q;
    head=(LNode*)malloc(sizeof(LNode));
    p=head;
    p->data=1;
    for(i=2;i<=n;i++)
    {
        q=p;
        p=(LNode*)malloc(sizeof(LNode));
        p->data=i;
        q->next=p;
    }
    p->next=head;
    return head;
}
void print(LNode *p)
{
    LNode *q;
    while(p!=p->next)//循环链表不为空
    {
        q=p->next;
        p=q->next;//此时p指向第三个节点
        printf("%d ",p->data);
        q->next=p->next;//删除第三个节点
        free(p);
        p=NULL;//P指针为设为空指针
        p=q->next;
    }
    printf("%d\n",p->data);//打印最后一个节点的值
}
int main()
{
    int n,m;//输入的组数
    scanf("%d",&n);
    while(n--)
    {
       scanf("%d",&m);
       LNode *p;
       p=create_list(m);
        print(p);
    }
    return 0;
}

约瑟夫环的问题:若不采用循环链表,直接递归求解较为简便

old=(new+q)%n;  J4(9)

其中n为总共有n人,q为每q个数裁减掉一个人

4、

输入先序遍历二叉树的序列,进行创建二叉树,再输出其中序遍历的结果

解析:定义全局字符数组str,用来存放输入的先序遍历字符串,定义全局变量i用于标识str数组的下标

主函数中输入需要创建的字符串并置i=0,调用insert函数进行插入

insert函数采用递归方法进行插入,if(c==‘#’)  return NULL;否则就创建结点进行递归插入

#include<stdio.h>
typedef struct BinNode
{
	char data;
	struct BinNode *lchild;
	struct BinNode *rchild;
}BinNode;
char str[100];
int i;
void Inorder(BinNode *root)
{
	if(root == NULL) 
	   return root;
	Inorder(root->lchild);
	printf("%c ",root->data);
	Inorder(root->rchild);
}
BinNode* insert(BinNode *root)
{
	char c=str[i++];
	if(c=='#')
	   return NULL;
	root=(BinNode*)malloc(sizeof(BinNode));
	root->data=c; 
	root->lchild=insert(root->lchild);
	root->rchild=insert(root->rchild);
	return root;
}
int main()
{
	BinNode *root=NULL;
	i=0;
   while(scanf("%s",str)!=EOF)
   {
     root=insert(root);	
	 Inorder(root);
   }
   system("pause");
   return 0;	
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值