链接:https://leetcode-cn.com/problems/symmetric-tree/
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
思路:
时间复杂度:遍历了这棵树,所以时间复杂度为 O(n)。
空间复杂度:空间复杂度和递归使用的栈空间有关,这里递归层数不超过 n,故空间复杂度为 O(n)。
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
def helper(p,q):
if not p and not q:
return True
if not p or not q:
return False
if p.val != q.val:
return False
return helper(p.left,q.right) and helper(p.right,q.left)
if not root:
return True
return helper(root.left,root.right)
思路同上。
时间复杂度:O(n)。
空间复杂度:用一个队列来维护节点,每个节点最多进队一次,出队一次,队列中最多不会超过 n 个点,故空间复杂度为 O(n)。
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
from collections import deque
def helper(p,q):
if not p and not q:
return True
if not p or not q:
return False
if p.val != q.val:
return False
return True
deq=deque([(root,root),])
while deq:
p,q=deq.popleft()
if not helper(p,q):
return False
if p: # 当p和q为None时,此时p.left不成立,所以需要判断。
deq.append((p.left,q.right))
deq.append((p.right,q.left))
return True
class Solution(object):
def isSymmetric(self, root):
if root == None:
return True
# 用队列保存节点
queue = [root,root]
while queue:
# 从队列中取出两个节点,再比较这两个节点
left = queue.pop()
right = queue.pop()
# 如果两个节点都为空就继续循环,两者有一个为空就返回false
if(left == None and right == None):
continue
if(left == None or right == None):
return False
if left.val!=right.val:
return False
# 将左节点的左孩子, 右节点的右孩子放入队列
queue.append(left.left)
queue.append(right.right)
# 将左节点的右孩子,右节点的左孩子放入队列
queue.append(left.right)
queue.append(right.left)
return True
如果觉得文章不错,希望大家可以关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会不定期更新更多的文章,祝我们终将自由。