【问题描述】
找出具有a+b+c个节点且高度最小的二叉树,满足以下条件:
-
-
a个节点具有2个子节点
-
b个节点具有1个子节点
-
c个节点没有子节点
-
如果不存在这样的树,则输出-1, 否则输出树的高度。
图示为a=2、b=1、c=3的满足条件的树,其高度为2。
树的高度是指从根节点到最底层叶节点之间的边数之和。
【输入形式】
输入的第一行为T,表示有T个测试样例,接下来的T行,每行3个整数a、b、c(0≤a、b、c≤105, a+b+c≥1),分别表示所构成的树有a+b+c个节点,其中a个节点具有2个子节点,b个节点具有1个子节点,c个节点没有子节点。
【输出形式】
输出为T行,每行一个整数,表示满足条件的树的最小高度,如果不存在这样的树,则输出-1。
【样例输入】
10 2 1 3 0 0 1 0 1 1 1 0 2 1 1 3 3 1 4 8 17 9 24 36 48 1 0 0 0 3 1
【样例输出】
2 0 1 1 -1 3 6 -1 -1 3
【样例说明】
完整代码:
#include <bits/stdc++.h>
using namespace std;
//叶子节点=二叉节点+1
int main()
{
int T=0;
cin >> T;
while(T--)
{
int a=0,b=0,c=0;
cin >> a >> b >> c;
if (c!=a+1)
{
cout << -1 << endl;
continue;
}
int h=0,i=1;
for (i;;i*=2)//先把2节点塞进树里
{
if (a<=0) break;
a-=i;
h++;
}
int b1=b+a;
for (int j=a+i;;)//再塞1节点
{
if (b1<=0) break;
b1-=j;
h++;
}
cout << h << endl;
}
return 0;
}