📢前言
🚀 算法题 🚀
🌲 每天打卡一道算法题,既是一个学习过程,又是一个分享的过程😜
🌲 提示:本专栏解题 编程语言一律使用 C# 和 Java 两种进行解题
🌲 要保持一个每天都在学习的状态,让我们一起努力成为算法大神吧🧐!
🌲 今天是力扣算法题持续打卡第26天🎈!
🚀 算法题 🚀
🌲原题样例
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入:p = [1,2,3], q = [1,2,3] 输出:true
示例 2:
输入:p = [1,2], q = [1,null,2] 输出:false
示例 3:
输入:p = [1,2,1], q = [1,1,2] 输出:false
提示:
- 两棵树上的节点数目都在范围 [0, 100] 内
- -104 <= Node.val <= 104
🌻C#方法:递归
思路解析
根据题意我们知道,最终目的就是 判断是不是相同的树
递归,前序遍历对比是否为相同的树
代码:
public class Solution { public bool IsSameTree(TreeNode p, TreeNode q) { //递归终止情况1:p, q都是null if (p == null && q == null) { return true; } //递归终止情况2:p, q中有一个为空,或者是p, q的节点值不等 else if (p == null || q == null || p.val != q.val) { return false; } else { //递归看左子树是否相同 bool isLeftSameTree = IsSameTree(p.left, q.left); //递归看右子树是否相同 bool isRightSameTree = IsSameTree(p.right, q.right); return isLeftSameTree && isRightSameTree; } } }
执行结果
通过 执行用时:92 ms,在所有 C# 提交中击败了49.73%的用户 内存消耗:24.4 MB,在所有 C# 提交中击败了38.50%的用户
复杂度分析
时间复杂度:O(min(m+n)) 空间复杂度:O(min(m+n))
🌻Java 方法一:深度优先搜索
思路解析
如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。
如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。
这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。
代码:
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { for (int i = 0; i != n; ++i) { nums1[m + i] = nums2[i]; } Arrays.sort(nums1); } }
执行结果
通过 执行用时:0 ms,在所有 Java 提交中击败了100.00%的用户 内存消耗:35.8 MB,在所有 Java 提交中击败了53.34%的用户
复杂度分析
时间复杂度:O(min(m+n))其中 mm 和 nn 分别是两个二叉树的节点数。对两个二叉树同时进行深度优先搜索,只有当两个二叉树中的对应节点都不为空时才会访问到该节点,因此被访问到的节点数不会超过较小的二叉树的节点数。 空间复杂度:O(min(m+n))其中 mm 和 nn 分别是两个二叉树的节点数。空间复杂度取决于递归调用的层数,递归调用的层数不会超过较小的二叉树的最大高度,最坏情况下,二叉树的高度等于节点数。
🌻Java 方法二:广度优先搜索
思路解析
也可以通过广度优先搜索判断两个二叉树是否相同。同样首先判断两个二叉树是否为空,如果两个二叉树都不为空,则从两个二叉树的根节点开始广度优先搜索。
使用两个队列分别存储两个二叉树的节点。初始时将两个二叉树的根节点分别加入两个队列。每次从两个队列各取出一个节点,进行如下比较操作。
比较两个节点的值,如果两个节点的值不相同则两个二叉树一定不同;
如果两个节点的值相同,则判断两个节点的子节点是否为空,如果只有一个节点的左子节点为空,或者只有一个节点的右子节点为空,则两个二叉树的结构不同,因此两个二叉树一定不同;
如果两个节点的子节点的结构相同,则将两个节点的非空子节点分别加入两个队列,子节点加入队列时需要注意顺序,如果左右子节点都不为空,则先加入左子节点,后加入右子节点。
如果搜索结束时两个队列同时为空,则两个二叉树相同。如果只有一个队列为空,则两个二叉树的结构不同,因此两个二叉树不同。
代码:
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int p1 = 0, p2 = 0; int[] sorted = new int[m + n]; int cur; while (p1 < m || p2 < n) { if (p1 == m) { cur = nums2[p2++]; } else if (p2 == n) { cur = nums1[p1++]; } else if (nums1[p1] < nums2[p2]) { cur = nums1[p1++]; } else { cur = nums2[p2++]; } sorted[p1 + p2 - 1] = cur; } for (int i = 0; i != m + n; ++i) { nums1[i] = sorted[i]; } } }
执行结果
通过 执行用时:0 ms,在所有 Java 提交中击败了100%的用户 内存消耗:35.7 MB,在所有 Java 提交中击败了72.26%的用户
复杂度分析
时间复杂度:O(min(m+n)) 空间复杂度:O(min(m+n))
💬总结
- 今天是力扣算法题打卡的第二十六天!
- 文章采用
C#
和Java
两种编程语言进行解题 - 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
- 那今天的算法题分享到此结束啦,明天再见!