二叉树OJ题(1)

news2025/4/17 22:05:18

目录

1.相同的树

2.对称二叉树

3.翻转二叉树

4.另一颗树的子树


  • 题目代码
  • 思路整体分析&注意事项
  • 易错点
  • 画图递归分析

    树=根+左子树+右子树

  • 分支的思想

  • 多情况考虑

1.相同的树

100. 相同的树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/same-tree/description/

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p == NULL && q == NULL)
    {
        return true;
    }
    if(p == NULL || q == NULL)
    {
        return false;
    }
    //两个都不为NULL
    if(p->val == q->val)
    {
        return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
    }
    return false;
}
  • 分治思想:根和根比较相同----->左子树和左子树比较&&右子树和右子树比较 
  • 一个节点一个节点比较(每个节点看成自己的根)
  • 两棵树的根节点都是NULL
  • 两棵树的一个根节点为NULL,另外一个不为NULL
  • 两棵树根节点都不为NULL
  1. 两个节点中数字相等,则继续往下比较(遍历比较)
  2. 不相等则返回false
  • && 必须左右两边子树都相等都为true才可返回true

2.对称二叉树

101. 对称二叉树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/symmetric-tree/

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    //都为null
    if(p == NULL && q == NULL)
    {
        return true;
    }
    //一个为为null 
    if(p == NULL || q == NULL)
    {
        return false;
    }
    //两个都不为空
    if(p->val == q->val)
    {
      return isSameTree(p->left,q->right) && isSameTree(p->right,q->left);
    }
    return false;
}


bool isSymmetric(struct TreeNode* root) {

    return isSameTree(root->left,root->right);
}
  • 分支思想:把左子树和右子树看成两棵树比较
  • 调用isSameTree
  • isSameTree是左节点等于右节点,右节点等于左节点,形成镜像相等
  • 其他同isSameTree

3.翻转二叉树

LCR 144. 翻转二叉树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/er-cha-shu-de-jing-xiang-lcof/description/

//方法1--交换向下
struct TreeNode* mirrorTree(struct TreeNode* root){
    if(root == NULL)
    {
        return NULL;
    }
    struct TreeNode*tmp=root->left;
    root->left=root->right;
    root->right=tmp;
    mirrorTree(root->left);
    mirrorTree(root->right);
    return root;
}
  • 方法1:交换往下,返回根节点
  • 分治思想:根指向的左右子树交换
  • 空树返回空
  • 交换左右子树
  • 往下走
  • 交换完左右子树,返回根节点

 

//方法2--向下交换
struct TreeNode* mirrorTree(struct TreeNode* root){
    if(root == NULL){
        return NULL;
    }
    struct TreeNode *left = mirrorTree(root -> left);
    struct TreeNode *right = mirrorTree(root -> right);
    root -> left = right;
    root -> right = left;
    return root;
}
  • 方法2:向下交换。向下 / 返回根节点 / 保存根节点 / 然后交换 
  • 分支思想:根指向的左右子树交换
  • 向下
  • 返回根节点 / 空
  • 保存根节点 / 空
  • 节点和节点交换 (空和空交换)

 

  • 返回值一定需要接收吗?
  • ?结构体交换 ?只交换val 
  • 递归返回:return / 程序结束

4.另一颗树的子树

572. 另一棵树的子树 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/subtree-of-another-tree/description/

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    //都为null
    if(p == NULL && q == NULL)
    {
        return true;
    }
    //一个为为null 
    if(p == NULL || q == NULL)
    {
        return false;
    }
    //两个都不为空
    if(p->val == q->val)
    {
      return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
    }
    return false;
}

bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root == NULL)
    {
        return false;
    }
    if(root->val == subRoot->val)
    {                                                                           
        if(isSameTree(root,subRoot))//返回true
        {
            return true;
        } 
    }
    return isSubtree(root->left,subRoot) || isSubtree(root->right,subRoot);
}
  • 分治思想:左右子树遍历+比较
  • 若为空树 则返回false
  • 若不为空树,遍历root
  • 比较并且找到第一个与subRoot子树的根节点相等的节点
  • 从这个节点开始比较后面的节点root&subRoot
  • 比较遍历整个子树subRoot
  • || 左右子树有一个包含subRoot即可
  • 从第一个相等的节点开始遍历比较
  1. 若全部相等,则root返回true
  2. 若不相等,不能root返回false,存在第二个相等的节点(还可能遍历) 

5.平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)

🙂感谢大家的阅读,若有错误和不足,欢迎指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1437677.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用x86架构+Nvidia消费显卡12G显存,搭建智能终端,将大模型本地化部署,说不定是未来方向,开源交互机器人设计

1,大模型本地部署 视频说明地址: https://www.bilibili.com/video/BV1BF4m1u769/ 【创新思考】(1):使用x86架构Nvidia消费显卡12G显存,搭建智能终端,将大模型本地化部署,语音交互机…

Oracle篇—logminer日志挖掘恢复误操作数据

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…

【UE Niagara】实现物体变形的两种方式

目录 效果 步骤 方式一、通过设置粒子位置 方式二、通过线性力 效果 步骤 方式一、通过设置粒子位置 新建一个Niagara系统,选择Empty模板 这里命名为“NS_Morph” 打开“NS_Morph”,先添加一个“Spawn Burst Instantaneous”模块,“Spa…

03 动力云客项目之登录功能后端实现

创建项目 使用Spring initializr初始化项目 老师讲的是3.2.0, 但小版本之间问题应该不大.

tomcat部署zrlog

1.下载zrlog包,并添加到虚拟机中 1)进入/opt/apache-tomcat-8.5.90/webapps目录 cd /opt/apache-tomcat-8.5.90/webapps2)下载zrlog包 wget http://dl.zrlog.com/release/zrlog-1.7.1-baaecb9-release.war 3)重命名包 mv zrlog-1.7.1-baaecb9-release zrblog 2…

修改JDK文件路径或名称(以及修改后jJRE文件变红的解决)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【ES数据可视化】kibana实现数据大屏

目录 1.概述 2.绘制数据大屏 2.1.准备数据 2.2.绘制大屏 3.嵌入项目中 1.概述 再来重新认识一下kibana: Kibana 是一个用于数据可视化和分析的开源工具,是 Elastic Stack(以前称为 ELK Stack)中的一部分,由 Ela…

RTE2023第九届实时互联网大会:揭秘未来互联网趋势,PPT分享引领行业新思考

随着互联网的不断发展,实时互动技术正逐渐成为新时代的核心驱动力。 在这样的背景下,RTE2023第九届实时互联网大会如期而至,为业界人士提供了一个探讨实时互联网技术、交流创新理念的绝佳平台。 本文将从大会内容、PPT分享价值等方面&#…

亚信安慧AntDB推动数据库自主可控

亚信安慧AntDB正致力于验证数据库软硬件全自主可控的可行性,并将其应用于运营商核心的交易场景,以替代国外商业解决方案。为了实现这一目标,亚信安慧AntDB的研发团队不断进行技术创新和实践探索。 该数据库以自主研发的技术为基础&#xff0…

新建或导入的Springboot项目不能识别,不能执行

在idea里创建好或导入的Springboot项目,执行文件不是那种能执行的绿色样子, 识别不到 解决方法:点击Maven,clean清除, 注意:只要执行springboot项目先clean 在 其它功能 如果还没识别,那可能…

Java排序算法-持续更新中

一、比较排序 1.1 交换排序 数组两元素交换位置 public class ArrayUtil {/*** 交换数组中的两个元素* param array 数组* param ele1Idx 元素1的索引下标* param ele2Idx 元素1的索引下表*/public static void swap(int[] array, int ele1Idx, int ele2Idx) {int tmp arra…

2024-02-06(Sqoop)

1.Sqoop Apache Sqoop是Hadoop生态体系和RDBMS(关系型数据库)体系之间传递数据的一种工具。 Sqoop工作机制是将导入或者导出命令翻译成MapReduce程序来实现。在翻译出的MapReduce中主要是对inputformat和outputformat进行定制。 Hadoop生态包括&#…

交易之路:从无知到有知的五个阶段

交易是易学的,它的操作很直观,也是复杂的,它的价格很玄妙。在金融行业日益壮大的背景下,新人辈出,而弱者则逐渐退出。市场生态在不断变化,我们每个人在交易之路上所经历的种种,既清晰可见又模糊…

微信小程序的图片色彩分析,窃取主色调,调色板

1、在微信小程序中创建包管理器 package.json npm init -y 2、安装 Mini App Color Thief 包 npm i --save miniapp-color-thief 3、构建 npm 4、wxml <canvas canvas-id"myCanvas"></canvas> <button bindtap"chooseImage">chooseIm…

阿里云服务器centos_7_9_x64位,3台,搭建k8s集群

目录 1.环境信息 2.搭建过程 2.1 安装Docker源 2.2 安装Docker 2.3 安装kubeadm&#xff0c;kubelet和kubectl 2.4 部署Kubernetes Master(node1) 2.5 安装Pod网络插件&#xff08;CNI&#xff09; 2.6 加入Kubernetes Node 2.7 测试kubernetes集群 3.部署 Dashboard…

百面嵌入式专栏(面试题)内存管理相关面试题1.0

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍内存管理相关面试题 。 一、内存管理相关面试题 page数据结构中的_refcount和_mapcount有什么区别?匿名页面和高速缓存页面有什么区别?page数据结构中有一个锁,我们称为页锁,请问trylock_page()和loc…

uniapp canvas游标卡尺效果

效果 根据公司业务仿照写的效果。原项目从微信小程序转uniapp,未测试该效果在android端效果。 uniapp直接使用canvas不可做子组件,否则无效果显示,其次显示时要考虑页面渲染超时的问题。 如效果所见,可以设置取值精度。 gitee地址:project_practice: 项目练习 - Gitee.…

Docker容器化K8s集群部署教程(一键部署sheel脚本)

本文通过脚本&#xff0c;可以快速地部署和配置Kubernetes环境&#xff0c;省去了各插件手动部署、配置的繁琐过程。 先看最终结果&#xff1a; [rootlocalhost home]# kubectl get node NAME STATUS ROLES AGE VERSION k8smaster Ready control-p…

微软.NET6开发的C#特性——类、结构体和联合体

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性。 C#经历了多年发展&#xff0c; 进行了多次重大创新&#xf…

python实现飞书群机器人消息通知(消息卡片)

python实现飞书群机器人消息通知 直接上代码 """ 飞书群机器人发送通知 """ import time import urllib3 import datetimeurllib3.disable_warnings()class FlybookRobotAlert():def __init__(self):self.webhook webhook_urlself.headers {…