LeetCode 101 對稱二叉樹的幾種思路(Python實現)


對稱二叉樹

 

給定一個二叉樹,檢查它是否是鏡像對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

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

但是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:

  1
  / \
2   2
  \   \
  3   3


思路1:使用層次遍歷解決,如果每一層都是對稱的 那么該二叉樹為對稱(正好先做的層次遍歷,發現這里可以直接用同樣思路做,把空節點用' '空格代替 以保證對稱)
 1 # Definition for a binary tree node.
 2 # class TreeNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.left = None
 6 #         self.right = None
 7 
 8 class Solution:
 9     def isSymmetric(self, root: TreeNode) -> bool:
10         if root == None:
11             return True
12         layer = [root]
13         res = []
14         while len(layer):
15             this_res = []
16             next_l = []
17             for n in layer:
18                 if n == ' ':
19                     this_res.append(' ')
20                     continue
21                 this_res.append(n.val)
22                 if n.left:
23                     next_l.append(n.left)
24                 else:
25                     next_l.append(' ')
26                 if n.right:
27                     next_l.append(n.right)
28                 else:
29                     next_l.append(' ')
30             for i in range(len(this_res)//2):
31                 if this_res[i] != this_res[len(this_res)-i-1]:
32                     return False
33             layer = next_l
34             
35         return True

遞歸判斷:

 1 # Definition for a binary tree node.
 2 # class TreeNode:
 3 #     def __init__(self, x):
 4 #         self.val = x
 5 #         self.left = None
 6 #         self.right = None
 7 
 8 class Solution:
 9     def judge(self, left, right):
10         if left == None and right == None:
11             return True
12         if left != None and right == None:
13             return False
14         if left == None and right != None:
15             return False
16         if left.val != right.val:
17             return False
18         return self.judge(left.right, right.left) and self.judge(left.left, right.right)
19   
20     def isSymmetric(self, root: TreeNode) -> bool:
21         if root == None:
22             return True
23         return self.judge(root.left, root.right)

迭代:

def isSymmetric(self, root):
        if not root:
            return True
        nodeList = [root.left,root.right]
        while nodeList:
            symmetricLeft = nodeList.pop(0)
            symmetricRight = nodeList.pop(0)
            if not symmetricLeft and not symmetricRight:
                continue
            if not symmetricLeft or not symmetricRight:
                return False
            if symmetricLeft.val != symmetricRight.val:
                return False
            nodeList.append(symmetricLeft.left)
            nodeList.append(symmetricRight.right)
            nodeList.append(symmetricLeft.right)
            nodeList.append(symmetricRight.left)
        return True

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM