P5018 对称二叉树
Posted for-miku
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P5018 对称二叉树相关的知识,希望对你有一定的参考价值。
链接:P5018
----------------------------------
这道题可以写暴力
------------------------------
暴力搜索,首先统计下每一个点的下属节点数,用来统计答案。
然后直接对称搜索就行
-------------------------------
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 5 using namespace std; 6 int son[10000001][2]//左右儿子; 7 int size[1000001]; 8 int n; 9 int v[1000001]; 10 int ans; 11 void dfs(int now) 12 size[now]=1;//统计包括自己在内的下属节点数 13 if(-1!=son[now][1]) 14 dfs(son[now][1]); 15 size[now]+=size[son[now][1]];//有儿子就加上儿子的 16 17 if(son[now][0]!=-1) 18 dfs(son[now][0]); 19 size[now]+=size[son[now][0]]; 20 21 22 bool check(int x,int y) 23 if(x==-1&&y==-1)//单独的一个儿子或者说都没有节点肯定对称 24 return 1; 25 if(x!=-1&&y!=-1&&v[x]==v[y]&&check(son[x][1],son[y][0])&&check(son[x][0],son[y][1])) 26 //到了这一层,如果还有-1,就一定不对称了 27 //值要 相等 28 //对称搜索下一层 29 return 1; 30 return 0; 31 32 33 34 int main() 35 scanf("%d",&n); 36 for(int i=1;i<=n;++i) 37 scanf("%d",&v[i]); 38 39 for(int i=1;i<=n;++i) 40 scanf("%d%d",&son[i][0],&son[i][1]); 41 42 dfs(1); 43 int ans=0; 44 for(int i=1;i<=n;++i) 45 if(check(son[i][1],son[i][0]))//搜索儿子 46 47 ans=max(ans,size[i]); 48 49 50 cout<<ans; 51 return 0; 52
以上是关于P5018 对称二叉树的主要内容,如果未能解决你的问题,请参考以下文章