NOIP2018PJT4 对称二叉树
一年后回首此题,此乃暴力也。
遇到T4想暴力,这个基本的框架应该熟练掌握,这就是一个基本的学习经验了,要形成这个直觉思维,这个基本的意识大家再熟悉一下,没AK NOIP就不应该了,对吧,诶。
#include<bits/stdc++.h> using namespace std; int w[1000005]; int a[1000005][2]; int s[1000005]; void dfs(int x)//求出以编号x的节点为根的树的节点数量 { s[x]=1;//根 if(a[x][0]!=-1) dfs(a[x][0]),s[x]+=s[a[x][0]];//左子树 if(a[x][1]!=-1) dfs(a[x][1]),s[x]+=s[a[x][1]];//右子树 } bool dfs1(int x,int y) { if(x==-1&&y==-1) return 1;//无左右子树,即叶节点,对称 if(x!=-1&&y!=-1&&s[x]==s[y]&&w[x]==w[y])//左右相应位置比较 { if(dfs1(a[x][0],a[y][1])&&dfs1(a[x][1],a[y][0])) return 1;//左左-右右,左右-右左 } return 0; } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&w[i]);//输入每个节点的权值 for(int i=1;i<=n;i++) scanf("%d%d",&a[i][0],&a[i][1]);//输入左右孩子 dfs(1); int ans=0; for(int i=1;i<=n;i++) { if(dfs1(a[i][0],a[i][1])) ans=max(ans,s[i]);//求出所有对称二叉树中节点最多的 } printf("%d",ans); return 0; }
关于NOIP,它寿终正寝了。一路顺风!