简单题目,我最开始想到的就是广度优先遍历,既然是广度优先,自然用栈。使用两个栈,一个树用一个栈。同时判断出现元素的要求。一旦不等于就可以退出函数返回False了。
from collections import deque
class Solution:
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
def check(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
deque1 = deque([p])
deque2 = deque([q])
while len(deque1) or len(deque2):
p = deque1.popleft()
q = deque2.popleft()
if not check(p, q):
return False
if p:
deque1.append(p.left)
deque1.append(p.right)
deque2.append(q.left)
deque2.append(q.right)
return True
在while循环中, if p的作用是检测是不是到达叶子节点了。因为叶子节点之后是None,None是没有left和right的。另外,仅仅判断p不是p and q,是因为经过check,p和q要吗是相等的,要吗都是None。只判断一个就可以了
另一个办法是递归。函数判断输入的两个节点的情况
1. 如果不相等,返回Fasle。
2. 如果相等,继续递归判断左右孩子节点的情况。
class Solution:
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
if p == None and q == None:
return True
if not p or not q:
return False
if p.val != q.val:
return False
else:
return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)