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

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇