没有算法,但是要注意细节。

首先无解的情况,显然的是最小深度的叶子节点和最大深度的叶子节点的深度差大于1;还有一种比较难想,就是如果一个点的左右子树都有最大和最小深度的叶子节点,这样交换左右子树也不行。

答案比较容易,就是统计一下右子树size>左子树size的节点个数即可。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=200005;
int n,h[N],cnt,tot,c[N][2],fa[N],si[N],de[N],mx[N],mn[N];
bool fl,v[N];;
int read()
{
int r=0,f=1;
char p=getchar();
while(p<'0'||p>'9')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void dfs(int u)
{
if(u>n)
{
mn[u]=de[u],mx[u]=de[u];
return;
}
for(int i=0;i<=1;i++)
{
de[c[u][i]]=de[u]+1;
dfs(c[u][i]);
si[u]+=si[c[u][i]];
}
mn[u]=min(mn[c[u][0]],mn[c[u][1]]);
mx[u]=max(mx[c[u][0]],mx[c[u][1]]);
if(mn[u]!=mx[u])
v[u]=1;
if(v[c[u][0]]&&v[c[u][1]])
fl=1;
}
int wk(int u)
{
if(u>n)
return 0;
return (si[c[u][1]]>si[c[u][0]])+wk(c[u][0])+wk(c[u][1]);
}
int main()
{
n=read();
tot=n;
for(int i=1;i<=n;i++)
{
c[i][0]=read(),c[i][1]=read();
if(c[i][0]==-1)
c[i][0]=++tot,si[c[i][0]]=1;
if(c[i][1]==-1)
c[i][1]=++tot,si[c[i][1]]=1;
}
de[1]=1;
dfs(1);//cerr<<mn<<" "<<mx<<endl;
if(mx[1]-mn[1]>1||fl)
{
puts("-1");
return 0;
}
printf("%d\n",wk(1));
return 0;
}

最新文章

  1. Python交互式编程导论----事件驱动编程
  2. 开源日志库log4cplus+VS2008使用
  3. Revenge of GCD HDU5019
  4. ADO.NET学习(一)
  5. java中JScrollPane不显示水平滚动条的解决办法
  6. sklearn-adaboost
  7. 序列化 java.io.Serializable
  8. request.user哪里来的?
  9. filter滤镜效果(css3属性)
  10. 【牛客网71E】 组一组(差分约束,拆位)
  11. Shell脚本中实现自动补全功能
  12. 【转】MySQL的学习--触发器
  13. Chrome开发者工具之JavaScript内存分析(转)
  14. zabbix日常监控项java(四)
  15. eclipse生成jar包 注意事项!
  16. 5-SOM神经网络
  17. linux进程——后台运行的方法
  18. Go -- 卸载 Go
  19. BZOJ2916 [Poi1997]Monochromatic Triangles 数论
  20. 【题解】Counting D-sets(容斥+欧拉定理)

热门文章

  1. ACM-ICPC 2018 沈阳赛区网络预赛 G 容斥原理
  2. Spring错误异常重试框架guava-retrying
  3. mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样
  4. 转: eclipse 快捷键列表(功能清晰版本)
  5. 对dispatch_async到主线程的逻辑封装成C/C++接口类型
  6. startActivity启动过程分析(转)
  7. Android 性能优化探究
  8. Make 编译脚本上手
  9. C#&amp;.NET高级面试题
  10. MaterialImageView