力扣第一百题-相同的树

260 阅读2分钟

「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

前言

力扣第一百题 相同的树 如下所示:

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 1:

输入: p = [1,2,3], q = [1,2,3]
输出: true

一、思路

这一题其实很简单,两个树相同是指:

  • 两个树在结构上相同
  • 两个数上个对应节点具有相同的值

很显然这一题我们使用递归来比对相同方向各节点的值即可,只要出现了不相同的情况,则代表这两个树不相同。反之,则这两个树为相同的。

这里我使用的是 前序遍历(根左右) 来遍历这两个树,我们分别从 pq 的根节点出发,再比对它两的左孩子,最后比较它两的右孩子。

需要注意的是,节点会有哪些情况是表示这两个节点不同呢?

  1. 有一个节点为空,另一个节点不为空
  2. 两个不为空的节点值不相等

除了上面的这两种情况,其他情况均认为节点相等,包括两个都为 空节点

综上所述,大致的步骤如下所示:

  1. 比对当前节点是否相同,如不同则返回 false
  2. 比对当前节点的左孩子是否相同,如不同则返回 false
  3. 比对当前节点的右孩子是否相同,如不同则返回 false

举个例子

此处以示例中的 p = [1,2,3], q = [1,2,3] 作为例子

  1. 从根节点出发,先比对 pq 的根节点,显然 1 == 1,则继续向下
  2. 比对他们的左孩子,显然 2 == 2,则继续向下
  3. 再比左孩子 2 的左孩子和孩子,发现都为 null,则向上回溯
  4. 回到节点 1,比对它两的右孩子 3,发现相同,继续向下
  5. 再比对右孩子 3 的左孩子和孩子,发现都为 null
  6. 所有节点均相等,返回结果 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);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~