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;
}