バイナリツリーを考えると、それは自身のミラーがあるかどうかを確認する(すなわち、その中心の周りに対称)。
たとえば、このバイナリツリーは [1,2,2,3,4,4,3]
対称であります:
1 / \ 2 2 / \ / \ 3 4 4 3
しかし、次は [1,2,2,null,3,null,3]
ないです。
。1 / \ 2 2 \ \ 3. 3。
注:
。ボーナスポイントは、あなたはそれを再帰的かつ反復的に両方を解決することができれば
左右の出力に順番に順番を、その後、順次、左右、比較結果の他の出力:マインドIをその幸せのように。しかし、私はそのような明らかにすることはできません上記の第二の木のように、間違っているようです。
ソリューション1 :(反復)
1 / * * 2 *バイナリツリーノードの定義。 3 *構造体のTreeNode { 4 * int型のval; 5 *のTreeNode *左; 6 *のTreeNode *右; 7 *ツリーノード(INT X):(NULL)左のval(X)、右(NULL){} 8 *}。 9 * / 10 クラスソリューション{ 11 公共: 12 BOOL isSymmetric(ツリーノード*のルート){ 13 キュー<ツリーノード*> ST。 14 st.push(ルート)。 15 st.push(ルート)。 16 { 17 ながら(!st.empty()) 18 { 19 のTreeNode *ノード1 = st.front()。 20 st.pop()。 21 ツリーノード* NODE2 = st.front()。 22 st.pop()。 23 であれば(ノード1 == nullptr && NODE2 == nullptr)続けます。 24 他の 場合((ノード1 == nullptr ||ノード2 == nullptr)|| node1->ヴァル= node2->!val)で 25 { 26 リターン はfalse ; 27 } 28 st.push(node1-> 左)。 29 st.push(node2-> 右)。 30 st.push(node1-> 右)。 31 st.push(node2-> 左)。 32 } 33 } 34 リターン 真。 35 } 36 }。
対称位置にキュー番号に木の内部に詰め利用ツリー階層を横断する、待ち行列は、数字は一致している、比較することができます。
対処方法2 :(再帰)
1 / * * 2 *バイナリツリーノードの定義。 3 *構造体のTreeNode { 4 * int型のval; 5 *のTreeNode *左; 6 *のTreeNode *右; 7 *ツリーノード(INT X):(NULL)左のval(X)、右(NULL){} 8 *}。 9 * / 10 クラスソリューション{ 11 公共: 12 BOOL isSymmetric(ツリーノード*のルート){ 13 であれば(ルート== nullptr)を返す 真。 14 リターン isMirror(root->左、root->右); 15 } 16 ブール isMirror(ツリーノード* ROOT1、ツリーノード* root2) 17 { 18 であれば(ROOT1 == nullptr && root2 == nullptr)を返す 真。 19 もし(ROOT1 == nullptr || root2 == nullptr)を返す 偽。 20 リターン(root1->ヴァル== root2->ヴァル)&& 21 isMirror(root1->左、root2->右)&& 22 isMirror(root1->右、root2-> 左)。 23 24 } 25 }。