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

 

转载于:https://www.cnblogs.com/For-Miku/p/11266169.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值