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 }
Ac

 

posted @ 2019-07-29 20:07  Simex  阅读(153)  评论(0编辑  收藏  举报