問題P5018と対称バイナリソリューション

タイトル内容はリンクされています

 

そして、質問の意味は、図は、サブツリー内の唯一のノードが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 - 48C = 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 ; 
}

終了

おすすめ

転載: www.cnblogs.com/lbssxz/p/11116449.html