バイナリツリーを考えると、それは自身のミラーがあるかどうかを確認する(すなわち、その中心の周りに対称)。
例えば、この二分木[1,2,2,3,4,4,3]は対称です。
1
/ \
2 2
/ \ / \
3 4 4 3
/ \
2 2
/ \ / \
3 4 4 3
しかし、以下の[1,2,2は、null、3、ヌル、3]ではありません。
1
/ \
2 2
\ \
3 3
/ \
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メガバイトを