最初のノード染色から拡大し始めたので、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 }。