Java判断两个二叉树是否相同+递归

该博客介绍了如何使用Java解决LeetCode的100_相同的树问题。博主首先讨论了判断两棵二叉树是否相同的逻辑,包括检查空树的情况以及比较根节点值。接着,博主阐述了利用递归方法比较左右子树的过程,指出在递归过程中,当遇到空节点时会终止递归,并且左右子树必须都相同才认为两棵树相同。
题目要求

给定两个二叉树,判断他们是否相同。注意:必须是完全相同,如果节点值、值得顺序不同都视为不同的树。力扣练习题:LeetCode-100_相同的树

思路:
  1. 首先判断两树null的情况。如果A树null且B树不null或者A树不null且B树null,那么可以肯定两树肯定不相等,返回false。
if ((A == null && B != null) || (A != null && B ==null)) {
            return false;
        }
  1. 如果两树都为null,则认为两树相同,因此空情况应该分开考虑。
if (A == null && B == null) {
            return true;
        }
  1. 空情况判断完,就可以判断值相等与否的问题了。首先判断两树根节点值是否相等。
if (A.val != B.val) {
            return false;
        }
  1. 重要:这一步涉及递归思路,排除了空情况和根节点值得情况,就要判断左右子树了。通过递归,将A树的左子树和B树的左子树比较,A树的右子树和B树的右子树比较。这里递归进行条件是A和B树的左子树即A.left和B.left,以及A.right和B.right。而终止条件是第一步和第二步的空判断。因为二叉树从根节点往左右子树走,必然会走到空节点,从而终止递归。而要求左右子树都要相同,因此用&&连接。
return isSameTree(A.left,B.left) && isSameTree(A.right,B.right);
代码
class Solution_100 {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        //一个为空,一个不为空
        if ((p == null && q != null) || (p != null && q ==null)) {
            return false;
        }
        //两个树都为空
        if (p == null && q == null) {
            return true;
        }
        if (p.val != q.val) {
            return false;
        }
        //且左右子树都相等
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
}
### Java 实现检查两棵二叉树是否相等 为了验证两棵二叉树是否相等,可以采用递归的方式比较每一对对应的节点。具体来说: #### 判定逻辑 当处理两个二叉树时,如果两者都为空,则认为这两棵相同的;如果仅有一个为空而另一个不为空,则显然不同。对于非空情况下的根节点及其左右子均需满足对应位置上的值一致的要求[^3]。 下面是一个完整的解决方案,用于定义 `TreeNode` 类以及实现上述算法的辅助函数 `isSameTree` 和主调用接口 `checkTreesEquality`: ```java // 定义二叉树节点类 class TreeNode { int val; TreeNode left, right; public TreeNode(int item) { val = item; left = right = null; } } public class BinaryTreeChecker { /** * 主要功能:提供外部访问入口以检测两棵二叉树是否完全相同. */ public static boolean checkTreesEquality(TreeNode p, TreeNode q) { return isSameTree(p, q); } private static boolean isSameTree(TreeNode t1, TreeNode t2) { // 如果两个节点都是null,则视为匹配成功 if (t1 == null && t2 == null) return true; // 若其中一个为null则说明结构已不同 if ((t1 != null && t2 == null) || (t1 == null && t2 != null)) return false; // 当前节点值不同也代表失败 if (t1.val != t2.val) return false; // 继续递归检验左右子 return isSameTree(t1.left, t2.left) && isSameTree(t1.right, t2.right); } } ``` 此代码片段展示了如何通过递归来逐层对比两棵二叉树中的各个节点,从而得出最终结论。每当遇到一对不同的节点或其下级分支存在差异时即刻返回 `false`; 只有在整个过程中始终未发现任何区别才会最终确认二者确实相等并返回 `true`.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值