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,它寿终正寝了。一路顺风!

posted @ 2019-11-12 17:26  轩辕东升  阅读(242)  评论(0编辑  收藏  举报