letecode [101] - 対称ツリー

バイナリツリーを考えると、それは自身のミラーがあるかどうかを確認する(すなわち、その中心の周りに対称)。
例えば、この二分木[1,2,2,3,4,4,3]は対称です。
    1
   / \
  2 2
 / \ / \
3 4 4 3

 
しかし、以下の[1,2,2は、null、3、ヌル、3]ではありません。
    1
   / \
  2 2
   \ \
   3 3

効果の件名:
  バイナリツリーを考えると、対称(左右対称構造と値が等しい)ではないと判定され
理解します:
  まず、それが空である場合、次いで、真のルートノードを決定し、そうでない場合、子が空のままの場合は、左と右の子が空でない場合、真であった、それが等しいか否かが判定され、等しい二つのサブツリーが対称ならば、決定し、そうでない場合falseです。
  2つのサブツリー2.:
    1)ROOT1は、子ノードを左及びroot2右の子ノードが空である、ROOT1右の子ノードとroot2子が対称、空である左の場合は、再帰的に比較次いで、ROOT1右の子とroot2が空でない子ノードを離れ、値が等しいです(右の子ROOT1、root2は子供を残しました)。
    右の子ノード空でない、ROOT1右の子ノードとroot2子が空である去ったとき2)ROOT1は、次に、再帰的比較(ROOT1は、root2右サブ子を左)、子ノードとroot2を残した場合、ROOT1右の子とroot2は、子ノードを残し非ヌル値が等しいと、比較が再帰的に継続され(ROOT1は、右の子root2を子左)及び(ROOT1右の子は、root2子を残しました)。
    3)その他の条件はfalseです。
  それを明確に考えて、これらの条件文を整理。
コードC ++:
/ * * 
 *バイナリツリーノードの定義。
 *構造体のTreeNode { 
 * INTヴァル。
 *のTreeNode *左; 
 *のTreeNode *右; 
 *ツリーノード(int型X):(NULL)左のval(X)、右(NULL){} 
 *}。
 * / 
クラスソリューション{
 パブリックBOOL isSymmetricLeftAndRight(ツリーノード* ROOT1、ツリーノード* root2){
         場合(root1->左== NULL && root2->右== NULL){
             場合(root1->右== NULL && root2- > ==左{)NULLを
                 返す 
            } それ以外の 場合(root1->右= NULL && root2->左= NULL && root1->右>ヴァル== root2->左>!ヴァル){
                 戻り isSymmetricLeftAndRightを(root1->右、root2-> 左)。
            } {
                 戻り 
            } 
        } それ以外 の場合(root1->左!= NULL && root2->右!= NULL && root1->左>ヴァル== root2->右> val)で{
             場合(root1->右== NULL && root2 - >左== NULL){
                 戻り isSymmetricLeftAndRightを(root1->左、root2-> 右)。 (root1->右!= NULL && root2->左!= NULL && root1->右>ヴァル== root2->左> val)で{
                 返す isSymmetricLeftAndRight(root1->左、root2->右)&isSymmetricLeftAndRight( root1->右、root2-> 左)。
            } {
                 戻り 
            } 
        } {
             戻り 
        } 
    } 
    
    BOOL isSymmetric(ツリーノード*のルート){
         場合(ルート== NULL)
             を返す もし(root->左== NULL &&NULL)が
             返さ もし((root->左= NULL && root->右== NULL)||(root->左== NULL && root->右=!!NULL))
             を返す もし(root->左>ヴァル== root->右> ヴァル){
             戻り isSymmetricLeftAndRight(root->左、root-> 右)。
        } 他に
            返す はfalse ; 
    } 
    
    
}。

 

結果:
   で実行する場合:  16 MSの   メモリ消費量:  14.8メガバイトを

 

おすすめ

転載: www.cnblogs.com/lpomeloz/p/10988641.html