Same Tree
两颗树同构判断很简单,首先两个树的结点同步移动,当前位置值相等之后再比较两颗子树即可,要不同时当前节点为空,要不同时有且值相等
class Solution(object):
def isSameTree(self, p, q):
"""
:type p: TreeNode
:type q: TreeNode
:rtype: bool
"""
if p and q:
return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
return p is q
Symmetric Tree
这题和上题可以说完全一样的,上面是找一模一样,这里找的是对称一样,我们只需要把helper函数里传参的地方稍改一下就可以了
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
return self.helper(root, root)
def helper(self, left, right):
if left and right:
return left.val == right.val and self.helper(left.left, right.right) and self.helper(left.right, right.left)
return left is right
此题还可以用迭代法求解,思路是利用BFS和队列了,也是每一个遍历的点来两份,一份往左一份往右就可以检查对称了,这里就不实现了
迭代的方法比较需要注意节点是否为空
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
queue = collections.deque([root, root])
while queue:
node1, node2 = queue.pop(), queue.pop()
if not node1 and node2:
return False
elif not node2 and node1:
return False
elif node1 and node2 and node1.val != node2.val:
return False
if node1:
queue.appendleft(node1.left)
if node2:
queue.appendleft(node2.right)
if node1:
queue.appendleft(node1.right)
if node2:
queue.appendleft(node2.left)
return True