二叉树OJ题(1)

目录

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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构.树的线索化兄弟表示法哈夫曼树

一、线索化 二、树的逻辑结构 三、哈夫曼树

JSDoc 注释规范

JSDoc 注释 在 前端项目中,注释格式包含了一些特殊标记,如 param、returns 等,这种注释通常是用来标记函数或方法的参数和返回值的数据类型和描述。 这种注释格式通常被称为 JSDoc 注释。在实际开发中,这样的注释可以被一些工具解…

购物车商品数量为0判断是否删除

当编辑商品的数量为1,再减的话,我们搞个模态提示,让用户决定是否要删除这个商品? //商品数量的编辑功能handleItemNumEdit(e){const {operation,id}e.currentTarget.dataset;console.log(operation,id);let {cart}this.data;let …

STM32 硬件随机数发生器(RNG)

STM32 硬件随机数发生器 文章目录 STM32 硬件随机数发生器前言第1章 随机数发生器简介1.1 RNG主要特性1.2.RNG应用 第2章 RNG原理框图第3章 RNG相关寄存器3.1 RNG 控制寄存器 (RNG_CR)3.2 RNG 状态寄存器 (RNG_SR)3.3 RNG 数据寄存器 (RNG_DR) 第3章 RNG代码部分第4章 STM32F1 …

多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测

多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测 目录 多维时序 | MATLAB实现基于CNN-LSSVM卷积神经网络-最小二乘支持向量机多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于CNN-LSSVM卷积神经…

有趣的CSS - 多彩变化的按钮

目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页面渲染效果 整体效果 这个按钮效果主要使用 :hover 、:active 伪选择器以及 animation 、transition 属性来让背景色循环快速移动形成视觉效果。 核心代码部分,简要说明了写法思路&…

生存类游戏《幻兽帕鲁》从部署服务器到开始体验全过程

SteamDB数据显示,《幻兽帕鲁》上线24小时内,在线人数峰值便突破200万,跻身Steam历史排行榜第二位。随着热度进一步发酵,《幻兽帕鲁》官方发布推文称,游戏发售不到6天,销量已经突破了 800万份。欢迎大家在阿…

问题:以下关于搜索OCPC说法错误的是()? #知识分享#知识分享#媒体

问题:以下关于搜索OCPC说法错误的是()? A.OCPC进入第二阶段,不能随意更换转化目标和页面 B.OCPC可以直接跳过第一阶段,直接开始跑第二阶段 C.开启OCPC计划后,系统就会…

零基础学编程从哪里入手,在学习中可以线上会议答疑解惑

一、前言 零基础学编程可以先从容易学的语言入手,比如中文编程,然后再学其他编程语言则会比较轻松,初步掌握编程思路。很多IT人士一般学2到3种编程语言。 今天给大家分享的中文编程开发语言工具资料如下: 编程入门视频教程链接…

java内部类概述及使用方法

前言: 打好基础,daydayup! 内部类 内部类概述: 内部类是类的五大成分之一(成员变量,方法,构造器,内部类,代码块),如果一个类定义在另一个类的内部&#xff…

虚拟飞控计算机:飞行控制系统验证与优化的利器

01.背景介绍 随着航空技术的飞速发展,飞行控制系统作为飞机的心脏,全面负责监测、调整和维持飞行器的姿态、航向、高度等参数,用以确保飞行的安全和稳定。为了满足这些要求,现代飞控系统通常采用先进的处理器和外设来确保其高效、…

DAY5.

握手: 第一次握手:客户端发送SYN包给服务器,并进入SYN_SENT状态,等待服务器返回确认包。 第二次握手:服务器接收到SYN包,确认客户端的SYN,发送ACK包,同时发送一个SYN包,…

docker常用10条容器操作命令

Docker 中一些常用的容器操作命令,我们可以根据需要使用这些命令来管理和操作 Docker 容器。我们这次以Hell-world这个镜像为例来说明: 1. docker pull hello-world #拉取hell-world镜像 2. docker images # 查看本地拉取的镜像 3. docker run hello…

[leetcode] 29. 两数相除

文章目录 题目描述解题方法倍增java代码复杂度分析 题目描述 给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断,也就是截去(truncate)其小数部分…

得物自研API网关实践之路

一、业务背景 老网关使用 Spring Cloud Gateway (下称SCG)技术框架搭建,SCG基于webflux 编程范式,webflux是一种响应式编程理念,响应式编程对于提升系统吞吐率和性能有很大帮助; webflux 的底层构建在netty之上性能表…

【SpringBoot篇】解决Redis分布式锁的 误删问题 和 原子性问题

文章目录 🍔Redis的分布式锁🛸误删问题🎈解决方法🔎代码实现 🛸原子性问题🌹Lua脚本 ⭐利用Java代码调用Lua脚本改造分布式锁🔎代码实现 🍔Redis的分布式锁 Redis的分布式锁是通过利…

【C语言】socket函数

一、socket函数函数的原型 int socket(int domain, int type, int protocol); 其中: domain参数指定套接字应该使用的协议族(例如,AF_INET表示IPv4协议族)。type参数指定套接字类型(例如,SOCK_STREAM表示…

阿里云游戏服务器多少钱一个月?

阿里云游戏服务器租用价格表:4核16G服务器26元1个月、146元半年,游戏专业服务器8核32G配置90元一个月、271元3个月,阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价: 阿里云游戏服务器租用价格表 阿…

MATLAB语音去噪系统

目录 一、背景 二、GUI页面 三、程序 3.1 LMS滤波程序 3.2 GUI程序 四、附录 一、背景 本文介绍了一种最佳的自适应滤波器结构,该结构采用最小均方差(LMS)作为判据,通过不断迭代自适应结构来调整得到最佳滤波器…

Godot 游戏引擎个人评价和2024年规划(无代码)

文章目录 前言Godot C# .net core 开发简单评价Godot相关网址可行性 Godot(GDScirpt) Vs CocosGodot VS UnityUnity 的裁员Unity的股票Unity的历史遗留问题:Mono和.net core.net core的开发者,微软 个人的独立游戏Steam平台分成说明独立游戏的选题美术风…