题目描述
示例
深度优先搜索
如果两个二叉树都为空,那这两个二叉树相同。如果两个二叉树中有且只有一个而空,则两个二叉树一定不相同。
如果两个二叉树都不为空,那么首先判断它们的根节点是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。
代码
# 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 isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
if not p and not q:
return True
elif not p or not q:
return False
elif p.val != q.val:
return False
else:
return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
方法二:广度优先搜索
同样首先判断两个二叉树是否为空,如果都不为空,则从两个二叉树地根节点开始广度优先搜索。
使用两个队列分别存储两个二叉树的节点,进行如下比较操作:
- 比较两个节点的值,如果两个节点的值不相同,则两个二叉树一定不相同;
- 如果两个节点的值相同,则判断两个节点的子节点是否为空,如果只有一个节点的左子节点为空,或者只有一个节点的额右子节点为空,则两个二叉树的结构不同,因此两个二叉树一定不同;
- 如果两个节点的子节点的结构相同,则将两个节点的非空子节点分别加入两个队列,子节点加入队列时需要注意顺序,如果左右子节点都不为空,则先加入左子节点,后加入右子节点。
如果搜索结束时两个队列同时为空,则两个二叉树相同。如果只有一个队列为空,则两个二叉树的结构不同,因此两个二叉树不同。
代码
# 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 isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
if not p and not q:
return True
if not p or not q:
return False
queue1 = collections.deque([p])
queue2 = collections.deque([q])
while queue1 and queue2:
node1 = queue1.popleft()
node2 = queue2.popleft()
if node1.val != node2.val:
return False
if (not node1.left) ^ (not node2.left):
return False
if (not node1.right) ^ (not node2.right):
return False
if node1.left:
queue1.append(node1.left)
if node1.right:
queue1.append(node1.right)
if node2.left:
queue2.append(node2.left)
if node2.right:
queue2.append(node2.right)
return not queue1 and not queue2
小知识点:collections.deque
collections里与队列相关的唯一一个集合:deque。
deque是双边队列(double-ended queue),具有队列和栈的性质,在list的基础上增加了移动、旋转和增删等。
常用方法
d = collections.deque([])
d.append('a') # 在最右边添加一个元素,此时 d = deque('a')
d.appendleft('b') # 在最左边添加一个元素,此时 d = deque(['b','a'])
d.extend(['c','d']) # 在最右边添加所有元素,此时 d = deque(['b','a','c','d'])
d.extendleft(['e','f']) # 在最左边添加所有元素,此时 d = deque(['f','e','b','a','c','d'])
d.pop() # 将最右边的元素取出,返回'd',此时 d = deque(['f','e','b','a','c'])
d.popleft() # 将最左边的元素取出,返回'f',此时 d = deque(['e','b','a','c'])
d.rotate(-2) # 向左旋转两个位置(正数则向右旋转),此时 d = deque(['a','c','e','b'])
d.count('a') # 队列中'a'的个数,返回1
d.remove('c') # 从队列中将'c'删除,此时 d = deque(['a','e','b'])
d.reverse() # 将队列倒序,此时 d = deque(['b','e','a'])