P5018 对称二叉树
链接:P5018
----------------------------------
这道题可以写暴力
------------------------------
暴力搜索,首先统计下每一个点的下属节点数,用来统计答案。
然后直接对称搜索就行
-------------------------------
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }