链接:https://leetcode-cn.com/problems/same-tree/
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1
/ \ / \
2 3 2 3
[1,2,3], [1,2,3]
输出: true
示例 2:
输入: 1 1
/ \
2 2
[1,2], [1,null,2]
输出: false
示例 3:
输入: 1 1
/ \ / \
2 1 1 2
[1,2,1], [1,1,2]
输出: false
思路:
1、如果两棵树都是空树,那两棵树必然相同;
2、如果两棵树一颗为空,另一颗不为空,那两棵树必然不相同;
3、排除以上两种情况后,说明两棵树都存在,这时判断两棵树的root结点是否相同;
如果两棵树的root结点不相同,跳出递归,返回False;
如果两棵树的root结点相同,则递归的判断两棵树的左子树和右子树。
时间复杂度 : O(n),其中 n 是树的结点数,因为每个结点都访问一次。
空间复杂度 : 最优情况(完全平衡二叉树)时为 O(logn),最坏情况下(完全不平衡二叉树)时为 O(n),用于维护递归栈。
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
if p is None and q is None:
return True
if p is None or q is None:
return False
if p.val != q.val:
return False
return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
class Solution:
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
if p is None and q is None:
return True
if p is None or q is None:
return False
if p.val == q.val:
return self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
判断树的结点是否相同的思路和递归一样,只不过实现的时候使用的层次遍历。
时间复杂度 : O(n),其中 n 是树的结点数,因为每个结点都访问一次。
空间复杂度 : 最优情况(完全平衡二叉树)时为 O(logn),最坏情况下(完全不平衡二叉树)时为 O(b),用于维护双向队列。
class Solution:
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
from collections import deque
def helper(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
deq=deque([(p,q),])
while deq:
p,q=deq.popleft()
if not helper(p,q):
return False
# 此处改为if q也可以。
if p: # 当p和q为None时,此时p.left不成立,所以需要判断。
deq.append((p.left,q.left))
deq.append((p.right,q.right))
return True
2.1就是先序遍历的递归形式,2.2是层次遍历的非递归算法。
如果觉得文章不错,希望大家可以关注我噢,点赞、收藏、在看、分享就再好不过了。如果有任何建议和问题,可以在下方给我留言,我会不定期更新更多的文章,祝我们终将自由。