给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例:
1 2
| 输入:p = [1,2], q = [1,null,2] 输出:false
|
题解
两个二叉树相同,当且仅当两个二叉树的结构完全相同,且所有对应节点的值相同。因此,可以通过搜索的方式判断两个二叉树是否相同。
如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。
如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。
这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。
1 2 3 4 5 6 7 8 9 10
| 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)
|
BFS
也可以通过广度优先搜索判断两个二叉树是否相同。同样首先判断两个二叉树是否为空,如果两个二叉树都不为空,则从两个二叉树的根节点开始广度优先搜索。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| def isSameTree2(self, p: TreeNode, q: TreeNode): queue_p = list() qeuue_q = list()
if not p and not q: return True elif not p or not q: return False queue_p.append(p) qeuue_q.append(q) print(p.val) print(q.val) while len(queue_p) and len(qeuue_q): t_p = queue_p.pop() t_q = qeuue_q.pop() if not t_p and not t_q: continue elif not t_p or not t_q: print("--") print(t_q.val) return False print(t_p.val,t_q.val) if t_p.val != t_q.val: print("==") return False queue_p.append(t_p.left) queue_p.append(t_p.right)
qeuue_q.append(t_q.left) qeuue_q.append(t_q.right) return True
|