【算法分析】
【参考代码】
解法1:链式存储结构二叉树
#include <bits/stdc++.h>
using namespace std;
#define N 1100000
struct Node
{
int n, left, right;//n:编号 left, right:左后孩子的地址
bool v;//布尔值
};
Node node[N];//结点池
int p, D, I, ans;
int create(int num, int d)//生成值为num的结点的树,根的层次为d
{
if(d > D)
return 0;
int np = ++p;
node[np].n = num;
node[np].left = create(2*num, d+1);
node[np].right = create(2*num+1, d+1);
return np;
}
void fall(int r)
{
if(node[r].left == 0 && node[r].right == 0)//如果r是叶子结点
{
ans = node[r].n;//记录最后一次小球落在的叶子结点编号
return;
}
if(node[r].v)//如果值为真
{
node[r].v = false;//变为假
fall(node[r].right);//走右子树
}