标签:
有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。
一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑到哪里呢?
4 2 3 4 0 0
12 7
第一感觉就是这题题目思路和清晰,一开始想到直接算出答案输出即可,考虑到正在学习数据结构,因此还是选择了用树写。
树写代码如下:
1 #include<iostream> 2 #include<queue> 3 #include<cmath> 4 using namespace std; 5 struct node 6 { 7 int data; 8 int flag; 9 node *lchild,*rchild; 10 node(); 11 }; 12 node::node() 13 { 14 flag=-1; 15 rchild=lchild=NULL; 16 } 17 void createTree(int d,node *&root) 18 { 19 queue<node *> q; 20 while(!q.empty()) 21 q.pop(); 22 root=new node; 23 static int count=0; 24 root->data=++count; 25 q.push(root); 26 node *t=root; 27 while(count!=pow(2,d)-1) 28 { 29 t=q.front(); 30 q.pop(); 31 t->lchild=new node; 32 t->lchild->data=++count; 33 q.push(t->lchild); 34 t->rchild=new node; 35 t->rchild->data=++count; 36 q.push(t->rchild); 37 } 38 t=NULL; 39 count=0; 40 } 41 /* 42 void LevelOrder(node *root) 43 { //队列实现 44 queue<node *> q; 45 node *t=root; 46 if(t!=NULL) q.push(t); //根非空,入队 47 while(!q.empty()) //队不空 48 { 49 t=q.front(); 50 q.pop(); //出队 51 cout<<t->data<<" "; 52 if(t->lchild) 53 q.push(t->lchild); //遍历左孩子 54 if(t->rchild) 55 q.push(t->rchild); //遍历右孩子 56 } 57 58 } 59 */ 60 void Go(int &t,node *&root) 61 { 62 if(root->lchild&&root->rchild){ 63 if(root->flag==-1) 64 { 65 Go(t,root->lchild); 66 root->flag=1; 67 } 68 else 69 { 70 Go(t,root->rchild); 71 root->flag=-1; 72 } 73 } 74 else 75 t=root->data; 76 } 77 78 int main() 79 { 80 int d,num; 81 while(cin>>d>>num,d&&num){ 82 node *root=NULL; 83 createTree(d,root); 84 int t; 85 for(int i=0;i<num;i++) 86 Go(t,root); 87 cout<<t<<endl; 88 } 89 return 0; 90 }
AC后看了下最优解法,果然是直接输出,标答如下:
1 2 #include<iostream> 3 using namespace std; 4 5 int main() 6 { 7 int d,i,k; 8 while(cin>>d>>i && (d+i) !=0) 9 { 10 k=1; 11 for (int j=0;j<d-1;j++) 12 if(i%2) {k=k*2;i=(i+1)/2;} 13 else {k=k*2+1;i /=2;} 14 cout<<k<<endl; 15 16 } 17 }
标签:
原文地址:http://www.cnblogs.com/ljwTiey/p/4295202.html