トピック住所:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/
タイトル説明
バイナリツリーが対称でないかを決定するために使用され、機能を実装してください。バイナリツリーとそのイメージ、それは対称的であるかのように。
例えば、二分木[1,2,2,3,4,4,3]は対称です。
1
/ \
22
/ \ / \
3443
が、以下の[1,2,2-、ヌル、3、ヌル 、3]は鏡像ではありません。
1
/ \
2 2
\ \
3 3
トピックの例
例1:
入力:ルート= [1,2,2,3,4,4,3]
出力:真の
例2:
入力:ルート= [1,2,2、ヌル、 3、ヌル、3]
出力:偽
問題解決のためのアイデア
DFS
(1)再帰:再帰的な方法は、分割された左右のサブツリーが空のサブツリー、左サブツリー及び右サブツリー完了し、左と右の子サブツリーである場合は特に、同じ値の左と右のサブツリーか否かを判断します左と右のサブツリーが等しい場合、いくつかの木の値が等しい、左ノードと比較サブツリーを左から右サブツリーの右ノード、およびノードの左右のノードはサブツリー及び右サブツリーを残しました。
(2)非再帰-スタック:ポインタpが左サブツリーの左トラバーサル順トラバースされている、左サブツリー及び右サブツリーを横断する二つのポインタpとq、使用右ノード> - - >左ノードをルートノードポインタqは右、右サブツリーのトラバーサルの順序有し>右ノード- - >左ノードルートノード
BFS
キュー:バイナリツリーが鏡像であるので、二つの連続するノードがこの機能を達成するために、等しくなるべきキューは、我々は、キュー要素をロードする必要があるので、キューは、、、、左の部分木に左の最初のノードを反復を使用して右ノードは、右の部分木、ノード左右及び左サブツリー・ノードの右サブツリー、最終的な判断、2つのノードが空である、条件が記載次いでミラー満たす荷電、ループは画像継続しますノードの一つが偽を返す、空である場合、ノード、又は、この時間は、ミラー構成を説明することはできません。
プログラムのソースコード
再帰
/ * * *バイナリツリーノードの定義。 *構造体のTreeNode { * INTヴァル。 *のTreeNode *左; *のTreeNode *右; *ツリーノード(INT X):ヴァル(x)は、左(NULL)、右(NULL){} *}。 * / クラスソリューション{ パブリック: BOOL isSymmetric(TreeNodeの* ルート){ 場合(ルート== nullptr)が返す 真。// 判空 リターン isMirror(root->左、root-> 右)。 } BOOL isMirror(ツリーノード*は、ツリーノードを左、右) { 場合(&&左から右== == nullptr A nullptr)リターン trueにし ; // 左と右のサブツリーは空で、trueに復帰 IF(左、右== == nullptr A || nullptr a)のリターン falseに ; // 左の部分木があります空、falseが返される IF(LEFT - >ヴァル=右>ヴァル!)復帰 はfalse ; // 左と右のサブツリーの値がfalseに戻り、等しくない リターン isMirror(左- >左、右>右)&& isMirror(左- >右、右>左); // ほぼ等しいサブツリーの時、ノードは、左と右、左サブツリー及び右サブツリー内のノードと左右と左の部分木のノードの右サブツリーをノードとを比較 } }。
スタック
/ * * *バイナリツリーノードの定義。 *構造体のTreeNode { * INTヴァル。 *のTreeNode *左; *のTreeNode *右; *ツリーノード(INT X):ヴァル(x)は、左(NULL)、右(NULL){} *}。 * / クラスソリューション{ パブリック: BOOL isSymmetric(TreeNodeの* ルート){ 場合(ルート== nullptr)が返す 真。 スタック <TreeNodeの*> S1、S2; ツリーノード * P = ルート。 ツリーノード * Q = ルート。 しばらく(P!= nullptr ||!s1.empty()){ しばらく(P =!nullptr A){ IF(Q || nullptr P - ==> = Q-ヴァル>ヴァル)!リターン falseに; //左と右のサブツリー1またはnullに二つのポインタ現在のノードの値が等しくない s1.push(P); s2.push(Q); P = P->は左; Q = Q-> 右; } IF(Q = nullptr A!)リターン falseに、Pが空である// qは、空すなわち、左右のサブツリーのための1つが空でない P = ; s1.top() s1.pop(); Q = s2.top(); s2.pop(); P= P - > 右; Q = Q-> 左。 } を返す 真。 } }。
キュー
/ * * *バイナリツリーノードの定義。 *構造体のTreeNode { * INTヴァル。 *のTreeNode *左; *のTreeNode *右; *ツリーノード(INT X):ヴァル(x)は、左(NULL)、右(NULL){} *}。 * / クラスソリューション{ パブリック: BOOL isSymmetric(TreeNodeの* ルート){ 場合(ルート== nullptr)が返す 真。 キュー <TreeNodeの*> QUE。 que.push(ルート - > 左)。 que.push(ルート - > 右)。 しばらく(!que.empty()) { ツリーノード * p = que.front()。 que.pop(); ツリーノード * Q = que.front()。 que.pop(); もし(P == nullptr && Q == nullptr)続けます。 もし(P == nullptr || Q == nullptr)のリターン はfalse ; もし(!p型>ヴァル= Q-> val)でのリターン はfalse ; que.push(P - > 左)。 que.push(Q - > 右)。 que.push(P - > 右)。 que.push(Q - >左)。 } を返す 真。 } }。