「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
前言
力扣第一百题 相同的树
如下所示:
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: p = [1,2,3], q = [1,2,3]
输出: true
一、思路
这一题其实很简单,两个树相同是指:
- 两个树在结构上相同
- 两个数上个对应节点具有相同的值
很显然这一题我们使用递归来比对相同方向各节点的值即可,只要出现了不相同的情况,则代表这两个树不相同。反之,则这两个树为相同的。
这里我使用的是 前序遍历(根左右) 来遍历这两个树,我们分别从 p
和 q
的根节点出发,再比对它两的左孩子,最后比较它两的右孩子。
需要注意的是,节点会有哪些情况是表示这两个节点不同呢?
- 有一个节点为空,另一个节点不为空
- 两个不为空的节点值不相等
除了上面的这两种情况,其他情况均认为节点相等,包括两个都为 空节点
。
综上所述,大致的步骤如下所示:
- 比对当前节点是否相同,如不同则返回
false
- 比对当前节点的左孩子是否相同,如不同则返回
false
- 比对当前节点的右孩子是否相同,如不同则返回
false
举个例子
此处以示例中的 p = [1,2,3], q = [1,2,3]
作为例子
- 从根节点出发,先比对
p
和q
的根节点,显然1 == 1
,则继续向下 - 比对他们的左孩子,显然
2 == 2
,则继续向下 - 再比左孩子
2
的左孩子和孩子,发现都为null
,则向上回溯 - 回到节点
1
,比对它两的右孩子3
,发现相同,继续向下 - 再比对右孩子
3
的左孩子和孩子,发现都为null
- 所有节点均相等,返回结果
true
即可
二、实现
实现代码
实现代码与思路中保持一致
public boolean isSameTree(TreeNode p, TreeNode q) {
return dfs(p, q);
}
private boolean dfs(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
} else if (p == null || q == null) {
return false;
} else if (p.val != q.val) {
return false;
}
return dfs(p.left, q.left) && dfs(p.right, q.right);
}
测试代码
public static void main(String[] args) {
TreeNode p = new TreeNode(1, new TreeNode(2), new TreeNode(3));
TreeNode q = new TreeNode(1, new TreeNode(2), new TreeNode(3));
new Number100().isSameTree(p, q);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~