前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【小Y学算法】⚡️每日LeetCode打卡⚡️——26.相同的树

【小Y学算法】⚡️每日LeetCode打卡⚡️——26.相同的树

作者头像
呆呆敲代码的小Y
发布2021-09-08 11:09:38
1960
发布2021-09-08 11:09:38
举报
文章被收录于专栏:呆呆敲代码的小Y 公众号

请添加图片描述
请添加图片描述

原题样例

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

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

示例 1:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
输入:p = [1,2,1], q = [1,1,2]
输出:false

提示:

  • 两棵树上的节点数目都在范围 [0, 100] 内
  • -104 <= Node.val <= 104

C#方法:递归

思路解析

根据题意我们知道,最终目的就是 判断是不是相同的树

递归,前序遍历对比是否为相同的树

代码:

代码语言:javascript
复制
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;
            }
        }
}

执行结果

代码语言:javascript
复制
通过
执行用时:92 ms,在所有 C# 提交中击败了49.73%的用户
内存消耗:24.4 MB,在所有 C# 提交中击败了38.50%的用户

复杂度分析

代码语言:javascript
复制
时间复杂度:O(min(m+n))
空间复杂度:O(min(m+n))

Java 方法一:深度优先搜索

思路解析 如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。

如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同,若不相同则两个二叉树一定不同,若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。

这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。

代码:

代码语言:javascript
复制
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);
    }
}

执行结果

代码语言:javascript
复制
通过
执行用时:0 ms,在所有 Java  提交中击败了100.00%的用户
内存消耗:35.8 MB,在所有 Java 提交中击败了53.34%的用户

复杂度分析

代码语言:javascript
复制
时间复杂度:O(min(m+n))其中 mm 和 nn 分别是两个二叉树的节点数。对两个二叉树同时进行深度优先搜索,只有当两个二叉树中的对应节点都不为空时才会访问到该节点,因此被访问到的节点数不会超过较小的二叉树的节点数。

空间复杂度:O(min(m+n))其中 mm 和 nn 分别是两个二叉树的节点数。空间复杂度取决于递归调用的层数,递归调用的层数不会超过较小的二叉树的最大高度,最坏情况下,二叉树的高度等于节点数。

Java 方法二:广度优先搜索

思路解析

也可以通过广度优先搜索判断两个二叉树是否相同。同样首先判断两个二叉树是否为空,如果两个二叉树都不为空,则从两个二叉树的根节点开始广度优先搜索。

使用两个队列分别存储两个二叉树的节点。初始时将两个二叉树的根节点分别加入两个队列。每次从两个队列各取出一个节点,进行如下比较操作。

  1. 比较两个节点的值,如果两个节点的值不相同则两个二叉树一定不同;
  2. 如果两个节点的值相同,则判断两个节点的子节点是否为空,如果只有一个节点的左子节点为空,或者只有一个节点的右子节点为空,则两个二叉树的结构不同,因此两个二叉树一定不同;
  3. 如果两个节点的子节点的结构相同,则将两个节点的非空子节点分别加入两个队列,子节点加入队列时需要注意顺序,如果左右子节点都不为空,则先加入左子节点,后加入右子节点。

如果搜索结束时两个队列同时为空,则两个二叉树相同。如果只有一个队列为空,则两个二叉树的结构不同,因此两个二叉树不同。

代码:

代码语言:javascript
复制
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];
        }
    }
}

执行结果

代码语言:javascript
复制
通过
执行用时:0 ms,在所有 Java  提交中击败了100%的用户
内存消耗:35.7 MB,在所有 Java 提交中击败了72.26%的用户

复杂度分析

代码语言:javascript
复制
时间复杂度:O(min(m+n))
空间复杂度:O(min(m+n))

总结

  • 今天是力扣算法题打卡的第二十六天!
  • 文章采用 C#Java 两种编程语言进行解题
  • 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
  • 那今天的算法题分享到此结束啦,明天再见!
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原题样例
    • C#方法:递归
      • Java 方法一:深度优先搜索
        • Java 方法二:广度优先搜索
        • 总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档