# Leetcode 101. Symmetric tree 對稱二叉樹 ## 思路 1. 先確立邊界條件,因為這一題最小節點為 1 ,所以我們只要確認有沒有左右節點就可以了,分為兩種情況: (1) 左右節點都不存在,代表只有根節點,所以樹是對稱的,回傳 True (2) 如果只有一個節點不存在,代表樹不是對稱的,回傳 False 2. 使用中序遍歷遍歷左右子樹,而因為要驗證樹是否對稱的,所以要反轉左右其中一個子樹,這樣子在中序遍歷的時候,左右子樹的節點才會是一樣的。 **做這一題之前,可以先做:** - leetcode 100 相同的樹 - leetcode 226 翻轉二叉樹 ```python= # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def isSymmetric(self, root: Optional[TreeNode]) -> bool: if not root.left and not root.right: return True if (not root.left and root.right) or (root.left and not root.right): return False stack = [] cur_left = root.left cur_right = self.invertBinaryTree(root.right) while cur_left or cur_right or stack: if (not cur_left and cur_right) or (cur_left and not cur_right): return False elif cur_left and cur_right: stack.append((cur_left, cur_right)) cur_left = cur_left.left cur_right = cur_right.left elif not cur_left and not cur_right: node_left, node_right = stack.pop() if node_left.val != node_right.val: return False cur_left = node_left.right cur_right = node_right.right return True def invertBinaryTree(self, root: TreeNode): if not root: return None root.left, root.right = root.right, root.left self.invertBinaryTree(root.left) self.invertBinaryTree(root.right) return root ``` 2023.07.12 AC (DFS Recursion) ```python= # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def isSymmetric(self, root: Optional[TreeNode]) -> bool: root.right = self.invertBinaryTree(root.right) return self.isSameTree(root.left,root.right) def isSameTree(self,p: TreeNode, q: TreeNode): if not p and not q: return True if (not p and q) or (not q and p) or p.val != q.val: return False return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right) def invertBinaryTree(self,root: TreeNode): if not root: return None self.invertBinaryTree(root.left) self.invertBinaryTree(root.right) root.left,root.right = root.right, root.left return root ```