対称二分木構造+(ロス・バレーP5018)を考えます

対称バイナリツリー

タイトル説明

以下の条件を玄玄を満たしている場合は、ツリーのルートの少しを持っている権利は、対称バイナリツリーと呼ばれていました:

二分木、
同じ左と交換ノードのすべてこれらの木の右サブツリー、新しいツリーと地点と等しい権利に対応する元のツリー構造。

今、私たちは、バイナリツリーを与えられて、私はあなたがそれサブツリー願って、ツリーは対称サブバイナリツリー、およびノー​​ドの最大数です。ツリー出力サブツリーノードしてください。

注意:樹木の根のみが対称バイナリツリーです。バイナリツリーノードTとその後続ノードの全て:T「サブツリー」とのサブルートノードにこの問題規則、に。

入力フォーマット
正の整数nの最初の行の、1がルートノードであるツリー、所定のノード番号1〜nは、所与のノードの数。

nは正の整数の第2行は、スペース、ノードiのi番目の正の整数の重みVIによって分離しました。

次のN 2つの正の整数liの行は、riは、それぞれ、左と右の子ノード番号i。左/右の子は、存在しない場合は-1 -1の表現を。二つの数字の間のスペースで区切られています。

出力フォーマット

総出力ファイルの行は、2つの対称的なフォークツリーノード与えられた最大ツリーを示す整数を含んでいます。


対称性、最大対称サブツリーを見つける(対称ツリーが、それはすべてのサブツリーが対称であるかどうかに依存)か否かが判定されるすべてのサブツリーを探します。

再帰的には、それはTLEとWA、ツリーは明らかであるトラバース単なる文字列の右部分木について考え始めていると、すべての単一のツリーは、値で構成することができます計算され、その後、同じ文字列の左と右のサブツリーかどうかを確認、しかし。

左及び右サブツリーをLであると仮定されるノードの各サブツリーのルートのためのポジティブ・ソリューションズ、R、それが満たすべき
W [L [L] = W [R [R]] && [R [L]、W = W [L [R]]。

#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=1000010;
const int M=1000100;
const int mod=1e5+7;
int n,w[N],L[N],R[N],size[N],ans;
int dfs(int fa){
	size[fa]=1;
	if(L[fa]!=-1) size[fa]+=dfs(L[fa]);
	if(R[fa]!=-1) size[fa]+=dfs(R[fa]);
	return size[fa];
}
bool judge(int l,int r){
	if(l==-1&&r==-1) return true;
	if(l!=-1&&r!=-1&&w[l]==w[r]&&judge(L[l],R[r])&&judge(R[l],L[r])) return true;
	return false;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	for(int i=1;i<=n;i++) scanf("%d%d",&L[i],&R[i]);
	dfs(1);
	for(int i=1;i<=n;i++){
		if(judge(L[i],R[i])){
			ans=max(size[i],ans);
		}
	}
	cout<<ans<<endl;
    return 0;
}
公開された264元の記事 ウォン称賛46 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_44291254/article/details/105103317