Leetcode-5148バイナリツリーぬりえゲーム(バイナリーツリーの着色ゲーム)

 最初のノード染色から拡大し始めたので、FLAC Bとして、最初のノードの父でなければならないので、この質問には、まだ少し意味で染色するか、またはパスAを遮断し、二人の息子を染め、勝つことができました。

 

したがって、領域はによって占めサブツリー以外のいずれかのB部によって占め、またはノードのサブツリー染色又は右サブツリー、3つだけのケースを残します。

だから我々は、染色された最初のノードを計算し、左のサブツリーと右サブツリー内のノードの数は、あなたが学ぶことができます

図1に示すように、左の部分木のノード番号、

2、右サブツリーのノード数

3、染料におけるノードAのサブツリー内の最初のノードの数

図4に示すように、ノードAのサブツリー内の最初のノードを除いた残りのノードの数が染色されます

 

もし

図1に示すように、複数のノードの残りの数よりも左側のサブツリーのノード数

図2に示すように、残りのノード番号の右サブツリーよりもノード数

図3は、完全に染色された最初のサブツリー・ノードはA、染料におけるノードAのサブツリー内の最初のノードの数以外の領域内のノードの数を放棄します

それは勝つことができないだけでなく、勝つことができるようになります。

1  クラスソリューション
 2  {
 3      公共4          int型 F(ツリーノード*のルート)
 5          {
 6              場合(!ルート)戻り 0 ;
7              戻り F(root->左)+ F(root->右)+ 1 8          }
 9          ツリーノード*プレオーダー(ツリーノード*根、INT X)
 10          {
 11              であれば(ルート!)戻りNULL。
12              であれば(root->ヴァル== X)
 13                  戻りルート。
14              ツリーノード* T1 =プレオーダー(root-> 左、X)。
15              ツリーノードT2 * =プレオーダー(root-> 右、X)。
16              であれば(T1)戻りT1。
17              他の 場合(T2)の戻りT2;
18              リターンNULL;
19          }
 20          BOOL btreeGameWinningMove(ツリーノード*根、整数 nは、INT X)
 21          {
 22              ツリーノード*さt = プレオーダー(ルート、X)。
23              int型 K1 = F(T-> 左)。
24              INTF = K2(T-> 右);
 25              // 。K1> N-K2-K1 ||> -n-N-K2-K1-K2-1 ||> K1 + K2 + 1は、それぞれ3例の説明に対応する
26である             IF( MAX(2 * K1、2 * K2)> N-N- ||> 2 *(K1 + K2 + 1 ))
 27                  リターン trueに28              リターン falseに;
 29          }
 30 }。

 

おすすめ

転載: www.cnblogs.com/Asurudo/p/11298007.html