《二叉树刷题计划》——相同的树、对称二叉树、另一棵树的子树

简介: 《二叉树刷题计划》——相同的树、对称二叉树、另一棵树的子树

🌰相同的树 0ecab350e1404f2f9e756343d8dbe4f4.png

思路:

📝如果这两棵树所各自对应的每个结点都相同,那么这两棵树就是相同的树。从根结点开始,然后再递归判断这两棵树各自的左右子树是否相同。只有当这两棵树的左右子树都相同时,才能说明是相同的树。

📝而判断左右子树是否相同,又能转换为相应的子问题求解——即左右子树的子树是否相同,就这样从上到下的进行递归判断,在递归的过程就完成了对每个结点的判断。


代码如下: 

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q != null) return false;
        if (p != null && q == null) return false;
        if (p == null && q == null) { // 如果代码能走到这里,说明p、q要么都为空,要么都不为空
            return true; // 都为空也认为是相同的
        }
        if (p.val != q.val) return false; // 代码走到这里,说明q、q都不为空
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); // 如果两个根结点的左右子结点同时为相同,说明是这两个树是相同的
    }
}

🌰对称二叉树

025a5364fb844f139d2d61446a399b74.png思路:

这个题目也其实也是判断树的各自对应结点是否相同,不过这里要判断的结点是呈轴对称分布的。即左子树的左子结点和右子树的右子结点要相同&&左子树的右子结点和右子树的左子结点要相同。

代码:

class Solution {
    // 判断两个结点是否轴对称
    public boolean tmp (TreeNode leftNode, TreeNode rightNode) {
        if (leftNode != null && rightNode == null) return false;
        if (leftNode == null && rightNode != null) return false;
        // 都为空时,也认为相同
        if (leftNode == null && rightNode == null) return true; // 代码能走到这里,说明这两个结点要么都为空要么都不为空
        if (leftNode.val != rightNode.val) return false; // 代码能走到这里,说明两个都不为空
        // 从上到下进行递归,对每个结点都进行了判断
        return tmp(leftNode.left, rightNode.right) && tmp(leftNode.right, rightNode.left);// 当只有当左子树的左子结点和右子树的右子结点相同 && 左子树的右子节点和右子树的左子节点相同的时候,才是轴对称的
    }
    public boolean isSymmetric(TreeNode root) {
        return tmp(root.left, root.right); // 这一步其实就是判断根结点的左子树和右子树是否轴对称
    }
}

🌰另一棵树的子树

f9f44bd04b7147028a1c16dffef2f70f.png思路:

要判断一个树 subRoot 是不是树Root的子树,那么可以判断 subRoot 是否和树 Root 的任意子树相等。那么就转化成上面的题——判断两个树是否相同

首先我们需要先判断root和subRoot是否相同,然后递归判断root的左子树和subRoot是否相同,接着就是root右子树是否相同,只要有一个相同就说明subRoot是root的一个子树。

那如果都不相同呢?那就判断root子树的子树是否和root相同呀!当递归判断到root的子树都为空时,如果还不相同,就说明subRoot真的不是root的子树。


代码

class Solution {
    // 判断是否是相同的树
public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q != null) return false;
        if (p != null && q == null) return false;
        if (p == null && q == null) { // 如果代码能走到这里,说明p、q要么都为空,要么都不为空
            return true; // 都为空也认为是相同的
        }
        if (p.val != q.val) return false; // 代码走到这里,说明q、q都不为空
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right); // 如果两个根结点的左右子结点同时为相同,说明是这两个树是相同的
    }
    //是不是子树 时间复杂度:O(t * s)
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root == null) return false; // 当递归到子树root都为空,说明subRoot一定不是root的子树
        // 判断包括当前结点在内的整个树是否和subRoot相同
        if(isSameTree(root,subRoot)) return true;
        // 判断当前树的左子树是否和subRoot相同
        if(isSubtree(root.left,subRoot)) return true;
        // 判断当前树的左子树是否和subRoot相同
        if(isSubtree(root.right,subRoot)) return true;
        return false; // 如果能走到这里,说明前面三个递归都结束了,如果root从上到下的所有子树没有一个是和subRoot是相同的(如果相同就返回了),说明subRoot真的不是root的子树
    }
}
相关文章
|
算法 数据可视化 数据挖掘
使用Python实现层次聚类算法
使用Python实现层次聚类算法
273 1
|
数据采集 机器学习/深度学习 人工智能
中文竞技场大模型测评-龙虎榜
本次测评选取写作创作相关、代码相关、知识常识、中文游戏、人类价值观、NLP专业领域6大场景和20个细分维度,分别对通义Qwen-Chat-7B、凤凰Phoenix-7B、ChatGLM2-6B、moss-moon-003-sft等大模型进行了超过 200+ 道题的评测。测评旨在为大家提供有关这些模型在不同领域和维度上的表现,更好地选择适合自己需求的模型和应用,期待这次测评能够为AI模型领域的学习和研究提供有价值的参考和指导。
70285 5
|
机器学习/深度学习 算法 计算机视觉
深度学习目标检测系列:一文弄懂YOLO算法|附Python源码
本文是目标检测系列文章——YOLO算法,介绍其基本原理及实现细节,并用python实现,方便读者上手体验目标检测的乐趣。
51907 0
|
5月前
|
传感器 人工智能 物联网
智能鞋:从脚下开始的科技革命
智能鞋:从脚下开始的科技革命
263 6
|
8月前
|
机器学习/深度学习 自然语言处理 文字识别
方案测评 | 多模态数据信息提取极速体验
多模态数据信息提取方案基于先进AI技术,能高效处理文本、图像、音频和视频等不同格式文件,提取有价值信息。该方案通过深度学习、自然语言处理等技术,实现结构化信息挖掘与分析,支持批处理模式,显著提高大规模数据处理效率,降低业务成本。用户可通过阿里云平台一键部署,无需数据搬运,确保高效安全的数据处理体验。此方案在性能和易用性上表现出色,具有广泛的应用价值和市场前景。
|
9月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
225 6
|
机器学习/深度学习 人工智能 算法
【C 言专栏】C 语言与人工智能的结合
【5月更文挑战第6天】C语言在人工智能领域发挥关键作用,以其高效、灵活和可移植性支持算法实现和应用开发。尽管学习难度大、开发效率低,但通过与Python等语言结合及工具优化,C语言能应对挑战并适应AI发展。随着技术进步,C语言与AI的融合将更紧密,驱动创新应用和科技进步。
661 0
【C 言专栏】C 语言与人工智能的结合
|
前端开发 架构师 算法
技术一号位的方法论《个人篇》——人成长的本质以及如何构建个人成长路线图
不论你是职场新人还是35岁的职场“老人”,成长是每个职场人都绕不开的话题,同时也是贯穿每个人职业生涯的痛点。本文主要帮助读者建立起对个人成长的认知,然后在此认知的基础上让大家理解成长的本质,最终通过文章的引导,来帮助读者完成个人成长路线图的确定以及落地实践。
13763 3
技术一号位的方法论《个人篇》——人成长的本质以及如何构建个人成长路线图
RabbitMQ实现延迟消息居然如此简单,整个插件就完事了
RabbitMQ实现延迟消息的方式有两种,一种是使用死信队列实现,另一种是使用延迟插件实现。死信队列实现我们以前曾经讲过这次我们讲个更简单的,使用延迟插件实现。
uniapp实现微信小程序横屏适配问题demo效果(整理)
uniapp实现微信小程序横屏适配问题demo效果(整理)