菜鸡每日一题系列打卡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天,只是新征程,期待更多干货……
学习 | 工作 | 分享
????长按关注“有理想的菜鸡”
只有你想不到,没有你学不到