思路:
直接根据题目模拟,对于枚举一个节点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 }