关于二叉树的建立
【深基16.例1】淘汰赛
题目描述
有 $2^n$($n\le7$)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?
输入格式
第一行一个整数 $n$,表示一共 $2^n$ 个国家参赛。
第二行 $2^n$ 个整数,第 $i$ 个整数表示编号为 $i$ 的国家的能力值($1\leq i \leq 2^n$)。
数据保证不存在平局。
输出格式
仅一个整数,表示亚军国家的编号。
样例 #1
样例输入 #1
3
4 2 3 1 10 5 9 7
样例输出 #1
1
------------------完全二叉树也可用(即不是2^n个叶子节点)
int value[260], winner[260];//第一个存成绩,第二个存编号
int n;
void dfs(int x)
{
if (x >= 1 << n) return;
else
{
dfs(2 * x);
dfs(2 * x + 1);
int lvalue = value[2 * x], rvalue = value[2 * x + 1];//从左到右的第一个非叶子节点开始
if (lvalue > rvalue) //比较他的子节点的大小
{
value[x] = lvalue;
winner[x] = winner[2 * x];//比较出来了就把他的成绩拉到这个节点
}
else
{
value[x] = rvalue;
winner[x] = winner[2 * x+1];
}
}
}
void solve()
{
cin >> n;
for (int i = 0; i < 1<<n; i++)
{
cin >> value[i + (1<<n)];//存成绩
winner[i + (1<<n)] = i + 1;//存编号
}
dfs(1);
if (value[2] > value[3]) cout << winner[3];
else cout << winner[2];
}