そして、質問の意味は、図は、サブツリー内の唯一のノードが7である、対称バイナリツリーではありません。
人気の、点xおよびサイズの対称の対称軸の点を通るX軸対称ルートとするサブツリーのノードを有する対称的な二分木が両側に等しくなければならない、これは対称二分木です。
アイデアは非常に簡単である:再帰的にツリーノードのサイズの各子ノードを処理し、次いで対称バイナリツリーかどうかを決定するために各ノードのサブツリーを列挙する。片側場合は、一度別のノードの剪定で出会った剪定返されませんでした他側のノードがあります。
具体的には、単一のノードは、対称二分木です。
コード:
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <アルゴリズム> に#define LL長い長い 使って 名前空間はstdを、 INTは READ(){ // 快读 INT K = 0、F = 1。チャー C = GETCHAR()。 一方、(C < ' 0 ' || C> ' 9 ' ){ もし、(C == ' - ')、F = - 1 。 C = GETCHAR()。 } 一方、(C> = ' 0 ' && C <= ' 9 ' ){ K * = K 10 + C - 48。C = GETCHAR()。 } 戻りのk *のF。 } int型のval [ 1000010 ]、サイズ[ 1000010 ;]、ANSを 構造体ZZZ { int型のL、R。 }ノード[ 1000010 ]。 INT DFS(INT POS){ // もし(POS == - 1)戻り 0 ; サイズ[POS]= DFS(ノード[POS] .L)+ DFS(ノード[POS] .R)+ 1 。 戻りサイズ[POS]。 } ブール duichen(INT LS、INT RS){ // 判断对称 場合(LS == RS && LS == - 1)リターン 1 。 もし(ヴァル[LS] ==ヴァル[RS] &&サイズ[LS] ==サイズ[RS] && duichen(ノード[LS] .L、ノード[RS] .R)&& duichen(ノード[LS] .R、ノード[RS] .L)) リターン 1 。 リターン 0 ; } int型のmain(){ int型 N = )(読み取ります。 以下のための(int型私は= 1を、I <= N。++ I)のval [I] = (読み取り) 以下のために(int型 i = 1 ; iが<= N; ++ i)は ノード[I] .L = read()は、ノード[i]を.R = 読み取ります(); DFS(1 )。 用(int型 i = 1 ; iが<= N ++ I)の 場合(duichen(ノード[I] .L、ノード[i]は.R))ANS = MAX(ANS、サイズ[I])。 printf(" %d個の\ n " 、ANS)。 リターン 0 ; }
終了