羅区P5018対称バイナリツリー(サーチ)

ああ...

 

トピックリンクします。https://www.luogu.org/problem/P5018

 

実際には、この質問は、検索から直接見つけることができます:

まず、初期化を行う各点のルートノードとして再帰子の数、およびツリーが対称でないように、その後のサブツリーのルートノードを見て、次に対称のサブツリーに記録された最大値。

 

ACコード:

1の#include <cstdioを>
 2の#include <iostreamの>
 3  
4  使用して 名前空間STDを、
5  
6  構造体ノード{
 7      のint L、R、V、lenの;
8      ノード(){L = - 1R = - 1 ;}
 9 } E [ 1000005 ]。
10  
11  INT N、ANS。
12  
13インラインINT DFS(int型K){
 14      、E [k]は.LEN = 1 15      もし(E [K] .L =! - 1)E [K] .LEN + =DFS(E [K] .L)
 16      IF(E [K] .R =! - 1。)E [K] + = .LEN DFS(E [K] .R);
 17。     リターンE [K] .LEN ;
 18 } // 初期化サブツリーサイズ
19。 
20インラインBOOLのチェック(int型 LS、int型RS){
 21は     BOOL P = 1 ;
 22である     IF(!E [LS] .V = E [RS] .V)リターン falseに23のIS      IF! - ((E [LS] .L = 1 && E [RS] .R == - 。1)||(E [LS] .L == - 。1!&& E [RS] .R = - 。1) ||(E [LS] .R = ! -1 && E [RS] .L == - 1)|| (E [LS] .R == - 1!&& E [RS] .L = - 1))のリターン はfalse ;
24      もし(E [LS] .L = - !1 && E [RS] .R =! - 1)P = P&検査(E [LS] .L、E [RS] .R)。
25      もし(E [LS] .R = - !1 && E [RS] .L =! - 1)P = P&検査(E [LS]・R、E [RS] .L)。
26      リターンのp;
27 } // 判断是否对称
28      
29  INT メイン(){
 30      のscanf(" %d個"、&N)
31      のためにINT iは= 1 ; iが<= N; I ++)のscanf(" %dの"、&E [I] .V)。
32      のためにINT iは= 1 ; iが<= N; I ++)のscanf(" %D%D "、&​​E [I] .L&E [I] .R)。
33の      DFS(1 )。
34      のためにINT iは= 1 ; iが<= N; I ++ 35          であれば(チェック(E [I] .L、E [I] .R))ANS = MAX(ANS、E [I] .LEN)。
36      のprintf(" %dの\ n " 、ANS)。
37     リターン 0 ;
38 }
ACコード

 

おすすめ

転載: www.cnblogs.com/New-ljx/p/11827637.html