10
已解决
样例二不对!!!
代码:
#include<iostream>
#include<cstring>
using namespace std;
int s=1;
long long n,a[15][3],zh[15],t,tt,map[15][15],dis[15];
bool check(int x){
for(int i=2;i<=x;i++)
for(int j=1;j<=dis[i];j++)
if(map[i][j]!=map[i][dis[i]-j+1])
return 0;
return 1;
}
int shu(int x){
if(x==1)return 1;
int c=1,s=0;
for(int i=2;i<=x;i++)c*=2,s+=c;
}
long long dfs(int x,int cs){
if(a[x][1]==-1&&a[x][2]!=-1||a[x][1]!=-1&&a[x][2]==-1)return cs-1;
if(a[x][1]==-1&&a[x][2]==-1)return cs-1;
dis[cs]++,map[cs][dis[cs]]=zh[a[x][1]],dis[cs]++,map[cs][dis[cs]]=zh[a[x][2]];
if(check(cs)){
int tmp=min(dfs(a[x][1],cs+1),dfs(a[x][2],cs+2));
if(check(tmp)){
s=max(s,max(shu(cs),shu(tmp)));
}
else s=max(s,shu(cs));
}
map[cs][dis[cs]]=0;
dis[cs]--;
map[cs][dis[cs]]=0;
dis[cs]--;
return cs-1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>zh[i];
for(int i=1;i<=n;i++){
cin>>t>>tt;
a[i][1]=t;
a[i][2]=tt;
}
for(int i=1;i<=n;i++){
memset(map,0,sizeof(map));
map[1][1]=zh[i];
dis[1]=1;
dfs(i,1);
}
cout<<s;
return 0;
}
注释:
1.a[i][1]编号为i的父节点的左孩子,a[i][2]编号为i的父节点的右孩子
2.shu(x):深度为x的完全二叉树的节点数量
完全二叉树:
O
| |
O O
| | | |
O O O O
(像这样)
紧急求助QWQ
@董子墨
@黄子澄
!!!!!
@各位大佬!!!
速答!!!
包涵宇在2020-11-01 11:40:48追加了内容
d!
包涵宇在2020-11-01 12:44:39追加了内容
顶!
包涵宇在2020-11-01 14:53:34追加了内容
顶!
包涵宇在2020-11-01 15:56:04追加了内容
d!
包涵宇在2020-11-01 16:01:11追加了内容
我看了一下,他说必须是子树,所以我的代码还要改一改,求修改意见!!!
(请大家点赞,我想上精品贴)
包涵宇在2020-11-03 20:11:58追加了内容
新代码!!!15分
#include<iostream>
#include<cstring>
using namespace std;
int s=1;
long long n,a[15][3],zh[15],t,tt,map[15][15],dis[15];
bool check(int x){
//if(x%2==0)return 0;
for(int i=2;i<=x;i++)
for(int j=1;j<=dis[i];j++)
if(map[i][j]!=map[i][dis[i]-j+1])
return 0;
return 1;
}
int shu(int x){
if(x==1)return 1;
int c=1,s=1;
for(int i=2;i<=x;i++)c*=2,s+=c;
return s;
}
long long dfs(int x,int cs){
if(a[x][1]==-1&&a[x][2]!=-1||a[x][1]!=-1&&a[x][2]==-1)return -1;
if(a[x][1]==-1&&a[x][2]==-1)return cs-1;
dis[cs]++,map[cs][dis[cs]]=zh[a[x][1]],dis[cs]++,map[cs][dis[cs]]=zh[a[x][2]];
if(check(cs)){
int tmp=min(dfs(a[x][1],cs+1),dfs(a[x][2],cs+1));
if(tmp!=-1&&check(tmp)){
s=max(s,max(shu(cs),shu(tmp)));
}
else s=max(s,shu(cs));
}
map[cs][dis[cs]]=0;
dis[cs]--;
map[cs][dis[cs]]=0;
dis[cs]--;
return -1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>zh[i];
for(int i=1;i<=n;i++){
cin>>t>>tt;
a[i][1]=t;
a[i][2]=tt;
}
for(int i=1;i<=n;i++){
memset(map,0,sizeof(map));
map[1][1]=zh[i];
dis[1]=1;
dfs(i,1);
}
cout<<s;
return 0;
}
包涵宇在2020-11-05 18:48:53追加了内容
大家快答啊~
包涵宇在2020-11-05 21:09:06追加了内容
快回答!!!
2
已采纳
map是某个头文件的关键字,您用它来做变量名???
脑洞清奇,实在看不懂,明明一道建树水题,这里提供思路:
输入->递归从小往大统计子树结点数目->统计时检查二叉树是否对称->输出最大节点数->AC
0
0
0
一个树是对称的这样判断
first:他的节点是不是奇数个
second:
O
| |
A B
| | | |
C D E F
A=B
如何实现?
递归!
一个节点是对称的
不然就要求
C=F&&D=E
蔡乐毅在2020-11-03 21:20:41追加了内容
@包涵宇 用递归!
蔡乐毅在2020-11-05 19:46:43追加了内容
我答啦!
0
0
0
0