1、深度优先搜索
# 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 p==None and q==None: # 停止递归的条件
return True
elif p==None or q==None:
return False
elif p.val != q.val:
return False
else: # 递归
return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
2、广度优先搜索
首先学习一下python的collections模块
collections是日常工作中的重点、高频模块,常用类型有:
计数器(Counter)
双向队列(deque)
默认字典(defaultdict)
有序字典(OrderedDict)
可命名元组(namedtuple)
这里主要看双向队列:
# 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 p==None and q==None:
return True
elif p==None or q==None:
return False
# 将p,q转化为队列
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
# 当前节点的左子节点以及右子节点
left1, right1 = node1.left, node1.right
left2, right2 = node2.left, node2.right
if (not left1) ^ (not left2):
return False
if (not right1) ^ (not right2):
return False
if left1:
queue1.append(left1)
if right1:
queue1.append(right1)
if left2:
queue2.append(left2)
if right2:
queue2.append(right2)
return not queue1 and not queue2
# print(queue1)
# [10,5,15]
# deque([TreeNode{val: 10, left: TreeNode{val: 5, left: None, right: None}, right: TreeNode{val: 15, left: None, right: None}}])