LeetCodeブラシ質問レコード3-No.101対称ツリー

二分木が与えられたら、それがそれ自体の鏡であるかどうか(つまり、その中心を中心に対称であるかどうか)を確認します。

たとえば、この二分木は対称です。

    1 
   / \ 
  2 2 
 / \ / \ 
3 4 4 3

しかし、以下はそうではありません:

    1 
   / \ 
  2 2 
   \ \ 
   3 3

注:
再帰的および反復的に解決できる場合は、ボーナスポイントがあります。

101.対称ツリー
バイナリツリーが与えられた場合、それがそれ自体のミラーイメージであるかどうかを確認します(つまり、軸対称)
たとえば、このバイナリツリーは対称です。
    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





おすすめ

転載: blog.csdn.net/qq_22472047/article/details/80640875