NOIP2018 PJ T4 对称二叉树

思路:

直接根据题目模拟,对于枚举一个节点T ,判断它和它的全部后代节点构成的二叉树是否是对称二叉树,若是,记录这棵树的节点数,对答案取max

maxans表示最大的答案,ans表示目前搜的这棵子树的答案,p表示这棵子树是否是对称二叉树,v表示这个节点的值,l,r表示它的左右儿子

work函数中的xls表示节点x的左儿子(x left son=>xls),xrs,yls,yrs以此类推

PS:其实不用结构体好些一点。。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int maxans=0,ans=0;int n;
 4 bool p=0;
 5 struct node{
 6     int v,l,r;
 7 }tree[1000010];
 8 void work(int x,int y){
 9     int xls=tree[x].l,xrs=tree[x].r,yls=tree[y].l,yrs=tree[y].r;
10     if(tree[xls].v==tree[yrs].v && tree[xrs].v==tree[yls].v){
11         if(xls!=-1){
12             ans+=2;
13             work(xls,yrs);
14         }
15         if(xrs!=-1 && x!=y){
16             ans+=2;
17             work(xrs,yls);
18         }
19     }else{
20         p=1;
21     }
22 }
23 int main(){
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++){
26         scanf("%d",&tree[i].v);
27     }
28     for(int i=1;i<=n;i++){
29         scanf("%d%d",&tree[i].l,&tree[i].r);
30     }
31     for(int i=1;i<=n;i++){
32         ans=1,p=0;
33         work(i,i);
34         if(p)continue;
35         maxans=max(maxans,ans);
36     }
37     cout<<maxans;
38     return 0;
39 }

猜你喜欢

转载自www.cnblogs.com/Laehcim/p/10888047.html
今日推荐