http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=63
小猴子下落
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述
有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。
一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑到哪里呢?
输入
输入二叉树叶子的深度D,和小猴子数目I,假设I不超过整棵树的叶子个数,D<=20.最终以 0 0 结尾
输出
输出第I个小猴子所在的叶子编号。
样例输入
4 2
3 4
0 0
样例输出
12
7
来源
上传者
原理:用层次遍历法建立二叉树!!!
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define max 100000
typedef struct node
{
int data;
int flag;
struct node *lchild;
struct node *rchild;
}btnode;
int num,I;
void creat(btnode *&b,int d)
{
btnode *q[max],*p,*lnode,*rnode;
int front,rear,h=1;
front=rear=0;
b=(btnode *)malloc(sizeof(btnode));
b->data=++num;
b->flag=0;
b->lchild=b->rchild=NULL;
q[++rear%max]=b;
while(h<=pow(2,d)-2)
{
p=q[++front%max];//chu queue
lnode=(btnode *)malloc(sizeof(btnode));
lnode->data=++num;
lnode->flag=0;
lnode->lchild=lnode->rchild=NULL;/
p->lchild=lnode;
q[++rear%max]=lnode;
h++;
rnode=(btnode *)malloc(sizeof(btnode));
rnode->data=++num;
rnode->flag=0;
rnode->lchild=rnode->rchild=NULL;//
p->rchild=rnode;
q[++rear%max]=rnode;
h++;
}
}//level 水平建立层次树,与层次遍历原理相同,除此外还有 前中后序建立法(递归)。
void fun(btnode *b,int i)
{
if(b!=NULL)
{
if(b->lchild==NULL)
{
if(i==I-1)
printf("%d\n",b->data);
}
else if(b->flag==0)
{
b->flag=1;
fun(b->lchild,i);
}
else
{
fun(b->rchild,i);
b->flag=0;
}
}
}
void level(btnode *b)
{
btnode *q[max],*p;
int front,rear;
front=rear=0;
q[++rear%max]=b;
while(front!=rear)
{
p=q[++front%max];
printf("%d ",p->data);
if(p->lchild!=NULL)
q[++rear%max]=p->lchild;
if(p->rchild!=NULL)
q[++rear%max]=p->rchild;
}
}
int main()
{
btnode *b;
int d,i;
while(~scanf("%d%d",&d,&I))
{
if(d==0)
break;
num=0;
creat(b,d);
//level(b);
//printf("\n");
for(i=0;i<I;i++)
fun(b,i);
}
return 0;
}