AcWing 1600. 完全二叉树
原题链接
简单
作者:
heiyou
,
2020-05-22 17:17:56
,
所有人可见
,
阅读 1756
这道题有好几个坑:
1. 看清YES的情况需要输出最后一个节点, NO的话是输出根节点
2. 一定要注意节点编号可能是两位数,用char读的话就凉了(我就是这么干的...查了好久),stoi函数
3. 思路:l r数组存储树, 在第一次读取数据的时候找出父节点
填数据,从根节点开始遍历,如果是完全二叉树,刚好可以填进1-n (根节点位置是1)
否则最后一个节点的位置一定大于n
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 60;
int l[N], r[N], max_k;
bool has_father[N];
int n, lastu;
void dfs(int root, int k)
{
if(max_k < k)
{
lastu = root;
max_k = k;
}
if(l[root] != -1) dfs(l[root], 2 * k); //左孩子
if(r[root] != -1) dfs(r[root], 2 * k + 1); //右孩子
}
int main()
{
cin >> n;
memset(l, -1, sizeof l);
memset(r, -1, sizeof r);
for(int i = 0; i < n; i ++)
{
string a, b;
cin >> a >> b;
if(a != "-") l[i] = stoi(a), has_father[l[i]] = true;
if(b != "-") r[i] = stoi(b), has_father[r[i]] = true;
}
int root = 0;
while(has_father[root]) root ++;
dfs(root, 1);
if(max_k > n) cout << "NO " << root << endl;
else cout << "YES " << lastu << endl;
return 0;
}
我也用的char,debug了好久没发现问题
我和你一样凉半天了~~~~~~~~~~
一样一样 我还怀疑编译器坏了哎