2面の質問:対称バイナリツリー(C ++)

トピック住所: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 - >左)。
        } 
        を返す 
    } 
}。

 

おすすめ

転載: www.cnblogs.com/wzw0625/p/12657538.html