每日一题——相同的树

菜鸡每日一题系列打卡100

每天一道算法题目 

小伙伴们一起留言打卡

坚持就是胜利,我们一起努力!

题目描述(引自LeetCode)

给定两个二叉树,编写一个函数来检验它们是否相同。

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

示例 1:


输入:       1         1
          / \       / \
         2   3     2   3


        [1,2,3],   [1,2,3]


输出: true
示例 2:


输入:      1          1
          /           \
         2             2


        [1,2],     [1,null,2]


输出: false
示例 3:


输入:       1         1
          / \       / \
         2   1     1   2


        [1,2,1],   [1,1,2]


输出: false

题目分析

这是一道二叉树的题目,二叉树是一个递归定义的数据结构,对二叉树的进一步了解可以看菜鸡写的菜鸡的算法修炼——二叉树(重建二叉树)

之前菜鸡曾经说过,题目如果涉及到递归定义数据结构的相关操作,其解决方式也可以考虑采用递归的方式进行解决。本题也不例外,甚至可以说,本题是可以采用递归解决的典型问题,仅仅三行代码便可搞定。而如果采用迭代的方式,处理起来就相对复杂一些,但逻辑上也并没有困难之处。

为了给大家提供不同的思路,菜鸡在本文中将采用上述两种方式进行解答。话不多说,上代码!

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
// 递归
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null || q == null) return p == q;
        if (p.val != q.val) return false;
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
}
// 迭代
class Solution {


    public boolean isSameTree(TreeNode p, TreeNode q) {
        LinkedList<TreeNode> pNodes = new LinkedList<>();
        LinkedList<TreeNode> qNodes = new LinkedList<>();
        pNodes.add(p);
        qNodes.add(q);


        while (!pNodes.isEmpty()) {
            p = pNodes.removeFirst();
            q = qNodes.removeFirst();
            if (!check(p, q)) return false;
            if (p != null) {
                if (!check(p.left, q.left)) return false;
                if (p.left != null) {
                    pNodes.add(p.left);
                    qNodes.add(q.left);
                }
                if (!check(p.right, q.right)) return false;
                if (p.right != null) {
                    pNodes.add(p.right);
                    qNodes.add(q.right);
                }
            }
        }


        return true;
    }


    private boolean check(TreeNode p, TreeNode q) {
        if (q == null || p == null) return p == q;
        if (p.val != q.val) return false;
        return true;
    }


}

代码分析

对代码进行分析,不妨设二叉树p的结点个数为m,二叉树q的结点个数为n,则:

  • 递归法:时间复杂度依赖于两棵树上层的相似性,最好情况下为O(1),最坏情况下为O(min(m, n));空间复杂度依赖于树的平衡性,最好情况下为O(logn),最坏情况下为O(n)。

  • 迭代法:时间复杂度依赖于两棵树上层的相似性,最好情况下为O(1),最坏情况下为O(min(m, n))空间复杂度依赖于树的平衡性,最好情况下为O(logn),最坏情况下为O(n)。

执行结果

递归的执行结果
 

迭代的执行结果

写在后面

时间飞快,2020年悄然进入了下半场

三个多月前,菜鸡更新了第一篇每日一题

转瞬之间,今天已是每日一题打卡第100天了

这段时间里,菜鸡接到了很多小伙伴的私信:

有的小伙伴找到了满意的工作,要整理面经投稿

有的小伙伴找到了刷题的节奏,每天四道奥利给

有的小伙伴开始了崭新的实习,开始投入新阶段

……

这段时间里,菜鸡收到了很多小伙伴的鼓励

也目睹了一部分小伙伴的暂时离开

希望大家都能有所收获

为了感谢大家的陪伴

菜鸡将抽取本文留言点赞数最多的一位小伙伴

送出10英寸小米液晶小黑板一份

2020年7月21日晚上19:00开奖

另外,@Bjamekharstar童鞋每天坚持留言打卡

菜鸡将为其送出一本《MongoDB应用设计模式》

请后台私信菜鸡收货地址

期待有更多小伙伴加入打卡队伍!
 

礼品虽小,参与其中,会有大收获

100天,只是新征程,期待更多干货……

学习 | 工作 | 分享

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值