给定一颗完全二叉树;可知道这棵树有以下特点:
1、若父亲结点为k,则其左孩子结点为2*k,右孩子结点为2*k+1
2、若深度为D,结点最多为(1<<D) — 1 ;
有一些小球从结点1处依次开始下落,问最后一个小球将会落到哪里?
如果遇到这样的问题,肯定不能用深度遍历,原因是,每个小球都要从上往下依次下落。
可以用循环来做,但是时空复杂度比较高;
#include<iostream> #include<string.h> using namespace std ; #define MAX 20 int main() { int D , I ; cin >> D >> I ; int s[100] ; memset(s,0,sizeof(s)) ; int n = 1<<D - 1 ; int k ; for(int i = 1 ; i <= I ; i++) for(k = 1 ; k <= n ; k = s[k] ? 2*k : 2*k+1 ) s[k] = !s[k] ; cout << k << endl ; }
#include<iostream> using namespace std ; int main() { int D , I ; cin >> D >> I ; int k = 1 ; for(int i = 1 ; i < D ; i++) if(I&1) {k *= 2 ; I = (I+1)/2 ;} else {k = 2 * k + 1 ; I = I/2 ;} cout << k << endl ; return 0 ; }
模拟二叉树 — 纪念植树节……,布布扣,bubuko.com
原文:http://blog.csdn.net/ding_hai_long/article/details/21076387