给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
方法1:
递归
首先考虑特殊情况,如果p、q都是空,返回True;
如果都不为空,那么先比较根节点的值是否相等,如果不相等,返回False,如果相等,进一步利用递归比较左子树和右子树是否相等;
除此之外还有p、q中有一个为空的情况,返回False
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isSameTree(self, p, q):
"""
:type p: TreeNode
:type q: TreeNode
:rtype: bool
"""
if not p and not q:
return True
elif p and q:
if p.val == q.val:
return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
else:
return False
else:
return False
#if not p and not q:
# return True
#if p and q:
# return p.val == q.val and self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
#return False
方法2:
迭代
遍历树,判断是否相等。这个时候要注意如果按照常规遍历,两个不同的树有可能遍历结果是一样的。所以要将None值也放在列表中, 即某个节点的左子树为空时,不仅仅从stack中pop出最后一个元素,并更新root为root.right,还要在此之前把None值放进遍历列表中,然后判断两棵树是否相同。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def sp_preorder(self,root):
if not root:
return []
stack = []
result = []
while root or stack:
if root: # root != None
stack.append(root)
result.append(root.val)
root = root.left
else:
result.append(None)
root = stack.pop()
root = root.right
return result
def isSameTree(self, p, q):
"""
:type p: TreeNode
:type q: TreeNode
:rtype: bool
"""
return self.sp_preorder(p) == self.sp_preorder(q)