这道题和第100道题目,判断两个树是否相等可以说是很相似,只不过这题是判断左右子树是不是对称的。其实在BFS遍历的时候,对左子树采用先左后右,对右子树采用先右后左即可。
迭代的做法
from collections import deque
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
def check(p, q):
if not p and not q:
return True
if not q or not p:
return False
if q.val != p.val:
return False
return True
if not root:
return True
lt, rt = root.left, root.right
deque1 = deque([lt])
deque2 = deque([rt])
while len(deque1) or len(deque2):
p, q = deque1.popleft(), deque2.popleft()
if not check(p, q):
return False
if p:
deque1.append(p.left)
deque1.append(p.right)
deque2.append(q.right)
deque2.append(q.left)
return True
但是BFS并不适合这道题,因为效率没下面办法好(也可能是数据问题)
另一种办法是递归,采用DFS的思想。
对于每一个要匹配的两个节点,在比较完节点值之后,需要比较的是节点的左节点和另一个节点的右节点,以及节点的右节点和另一个节点的左节点。因为函数会直接递归到树的低端,所以是深度优先遍历。
from collections import deque
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
def check(p, q):
if not p and not q:
return True
if not q or not p:
return False
if q.val != p.val:
return False
return check(p.left, q.right) and check(p.right, q.left)
if not root:
return True
return check(root.left, root.right)