二分木が与えられたら、それがそれ自体の鏡であるかどうか(つまり、その中心を中心に対称であるかどうか)を確認します。
たとえば、この二分木は対称です。
1 / \ 2 2 / \ / \ 3 4 4 3
しかし、以下はそうではありません:
1 / \ 2 2 \ \ 3 3
注:
再帰的および反復的に解決できる場合は、ボーナスポイントがあります。
バイナリツリーが与えられた場合、それがそれ自体のミラーイメージであるかどうかを確認します(つまり、軸対称)
たとえば、このバイナリツリーは対称です。
1 / \ 2 2 / \ / \ 3 4 4 3しかし、以下はそうではありません:
1 / \ 2 2 \ \ 3 3
アイデア:この問題は再帰によって非常にうまく解決できます。最初は、左側のサブツリーと右側のサブツリーが再帰的に下にあります。最初のツリーの左側のサブツリーと2番目のツリーの右側のサブツリーが再帰的に同じである場合、最初の1つのツリーの右側のサブツリーと2番目のツリーの左側のサブツリーが再帰的にまったく同じである場合、2つのツリーは対称になります。ルートノードの2つのサブツリーが対称である場合、ツリー全体が対称になります。
方法1:递归方法
def isSymmetric(self, root):
if not root: return True
return self.helper(root.left, root.right)
def helper(self, left, right):
# first make sure left and right is not none
if left and right:
if left.val == right.val:
return self.helper(left.left, right.right) and self.helper(left.right, right.left)
else:
return False
else:
# otherwise,return left == right
return left == right
方法2:スタックデータ構造を使用してデータを格納する反復方法最初に、ルートの左右のノード(リストで示される)をスタックに追加します。スタックが空でない場合は、左右のノードをポップアップします。左右のノードが空でない場合は、判断します。左ノードと右ノードの値が等しいかどうか、等しい場合は、左ノードの左の子、右ノードの右の子、左ノードの右の子、右ノードの左の子などがスタックにプッシュされます。左右のノードが利用できる場合は、2つのノードが等しいかどうかを判断し、等しい場合は次のサイクルに入ります。
def isSymmetric(self, root):
if not root: return True
stack = [[root.left, root.right]]
while stack:
node1, node2 = stack.pop()
if node1 and node2: # make sure not None
if node1.val != node2.val:
return False
else:
stack.append([node1.left, node2.right])
stack.append([node1.right, node2.left])
else:
if node1 == node2:
continue
else:
return False
return True