Given two binary trees, write a function to check if they are the same or not.
Two binary trees are considered the same if they are structurally identical and the nodes have the same value.
Example 1:
Input: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] Output: true
Example 2:
Input: 1 1 / \ 2 2 [1,2], [1,null,2] Output: false
Example 3:
Input: 1 1 / \ / \ 2 1 1 2 [1,2,1], [1,1,2] Output: false
看到题目的第一时间是没有思路的,可能用深搜、广搜?后来想了一下,不就是比较每一个节点的值,然后再比较它们的左右子树是否相同吗?因此,想到了递归算法。代码如下
class Solution:
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
if p == None and q == None:
return True
if p == None and q != None or p != None and q == None:
return False
if p.val != q.val:
return False
return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
测评的结果
Runtime: 36 ms, faster than 71.97% of Python3 online submissions for Same Tree.
Memory Usage: 13.1 MB, less than 5.74% of Python3 online submissions for Same Tree.
既然有递归算法,那么我们也尝试一下非递归算法
class Solution:
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
stack = [(p, q)]
while(len(stack)!= 0):
temp_p, temp_q = stack.pop()
if temp_p == None and temp_q == None:
continue
if temp_p == None and temp_q != None or temp_p != None and temp_q == None:
return False
if temp_p.val != temp_q.val:
return False
stack.append((temp_p.left, temp_q.left))
stack.append((temp_p.right, temp_q.right))
return True
测评结果
Runtime: 40 ms, faster than 39.18% of Python3 online submissions for Same Tree.
Memory Usage: 13.2 MB, less than 5.74% of Python3 online submissions for Same Tree.