原题:
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
解题思路:
网址:https://leetcode-cn.com/problems/same-tree/solution/100-xiang-tong-de-shu-by-edelweisskoko-3iqr/
思路一:DFS 深度优先搜索
特例处理,先比较两个根节点:
- 如果两节点都为空,返回true;
- 如果两节点一个为空一个不为空,返回false;
- 如果两节点值不相同,返回false
- 如果两个节点值相同,比较左子树和右子树是否相同,这就进入了递归。
class Solution:
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
if not p and not q: # 如果两节点都为空,返回true;
return True
elif not p or not q: # 如果两节点一个为空一个不为空,返回false;
return False
elif p.val != q.val: # 如果两节点值不相同,返回false
return False
else: # 如果两个节点值相同,比较左子树和右子树是否相同,这就进入了**递归**。
return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
代码逐步解析:
----关于前、中、后序遍历,见我另一篇文章:
https://blog.csdn.net/qq_37706433/article/details/122492862
import collections
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 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)
if __name__ == '__main__':
s = Solution()
# 创建二叉树1
root1 = TreeNode(10)
root1.left = TreeNode(5)
root1.right = TreeNode(15)
root1.left.left = TreeNode(2)
root1.left.right = TreeNode(5)
root1.right.right = TreeNode(22)
root1.left.left.left = TreeNode(1)
# 创建二叉树2
root2 = TreeNode(10)
root2.left = TreeNode(5)
root2.right = TreeNode(15)
root2.left.left = TreeNode(2)
root2.left.right = TreeNode(5)
root2.right.right = TreeNode(22)
root2.left.left.left = TreeNode(1)
# 实例化
result_list = s.isSameTree(root1, root2)
print('result_list:', result_list)