LeetCode——OJ题之二叉树【上】

news2024/11/25 20:39:17

 ✏️✏️✏️今天给大家分享几道二叉树OJ题!

😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛

✏️✏️✏️如果觉得我分享和内容还不错的话,可以给我一个小小的赞吗

清风的CSDN博客

 

目录

一、检查两棵树是否相同 

 二、另一棵树的子树

 三、翻转二叉树

四、平衡二叉树的判断

 五、对称二叉树


一、检查两棵树是否相同 

两个二叉树相同,当且仅当两个二叉树的结构完全相同,且所有对应节点的值相同。因此,可以通过搜索的方式判断两个二叉树是否相同。 

 思路:

  • 如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。
  • 如果两个二叉树都不为空,那么首先判断它们的根节点的值是否相同。

  • 若不相同则两个二叉树一定不同。

  • 若相同,再分别判断两个二叉树的左子树是否相同以及右子树是否相同。

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

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if((p==null && q!=null) || (p!=null && q==null)){
            return false;
        }
        if(p==null && q==null){
            return true;
        }
        //走到这里,p和q都不为空
        if(p.val!=q.val){
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
}

 二、另一棵树的子树

思路:

  • 首先可以想到,如果两棵树都为空,那么直接返回false就可以了。
  • 其次可以判断,题目所给的两棵树是否相同,如果相同,也满足条件,返回true。而判断两棵树相同,又需要深度优先搜索,这里就可以利用上面那道题的判断两棵树相同的思路,进行判断。
  • 如果两棵树不相同,那么就把题目所给的子树分别和另一棵树的左子树比较,右子树比较。
  • 可以通过递归的方式去进行深度优先搜索。 
class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root==null && subRoot==null){
            return false;
        }
        if(isSameTree(root,subRoot)){
            return true;
        }
        if(root==null){
            return false;
        }
        if(isSubtree(root.left,subRoot)){
            return true;
        }
        if(isSubtree(root.right,subRoot)){
            return true;
        }
        return false;
    }
     public boolean isSameTree(TreeNode p, TreeNode q) {
        if((p==null && q!=null) || (p!=null && q==null)){
            return false;
        }
        if(p==null && q==null){
            return true;
        }
        //走到这里,p和q都不为空
        if(p.val!=q.val){
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
}

 三、翻转二叉树

思路:

  • 从根节点开始,递归地对树进行遍历。

  • 从根的左右节点先开始翻转。翻转其实就是交换节点的引用。交换完根的左右节点之后,递归的进行翻转左子树和右子树即可。

  • 每次翻转后,先判断翻转后的节点的next域是否为null,若为null则无需进行再次翻转。也相当于是一个小小的优化。

    class Solution {
        public TreeNode invertTree(TreeNode root) {
            if(root==null){
                return null;
            }
            TreeNode tmp=root.left;
            root.left=root.right;
            root.right=tmp;
            if(root.left==null && root.right==null){
                return root;
            }
           invertTree(root.left);
           invertTree(root.right);
    
            return root;
        }
    }

    四、平衡二叉树的判断

 

思路:

  • 一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。
  • 用递归的方式判断二叉树是不是平衡二叉树,其实就是左子树个右子树的高度差的绝对值是否小于等于1。
  • 那么只需要递归的判断二叉树的左右子树的高度差的绝对值是否不大于1即可。
  • 可以定义一个求高度的方法,当在递归调用这个方法的过程中,若发现左右子树的高度差大于1时,直接返回-1,则不需要在进行递归遍历,减少递归次数。
class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root==null){
            return true;
        }
        return height(root)>0;

    }
    private int height(TreeNode root){
        if(root==null){
            return 0;
        }
        int leftHeight=height(root.left);
        if(leftHeight<0){
            return -1;
        }
        int rightHeight=height(root.right);
        if(leftHeight>=0 && rightHeight>=0 && Math.abs(leftHeight-rightHeight)<=1){
            return Math.max(leftHeight,rightHeight)+1;
        }else{
            return -1;
        }
    }
}

 五、对称二叉树

思路:

  • 如果一个树的左子树与右子树镜像对称,那么这个树是对称的。

  • 要判断树的左子树与右子树对称,首先一个为空一个不为空的情况,那么一定是不对称的。其次,判断左子树的根和右子树的根的值是否一样,以及左树的左和右树的右、左树的右和右树的左是否相同,利用递归的方式进行判断即可。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null){
            return true;
        }
        return isSymmetree(root.left,root.right);

    }

    public boolean isSymmetree(TreeNode lefttree,TreeNode righttree){
        if((lefttree!=null&&righttree==null) || (lefttree==null&&righttree!=null)){
            return false;
        }
        if(lefttree==null && righttree==null){
            return true;
        }
        if(lefttree.val!=righttree.val){
            return false;
        }
        return isSymmetree(lefttree.right,righttree.left) && 
               isSymmetree(lefttree.left,righttree.right);
    }
}

 


希望各位看官读完文章后,能够有所提升。

🎉好啦,今天的分享就到这里!!

创作不易,还希望各位大佬支持一下!

👍点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论:你的意见是我进步的财富

 

 

 

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

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

相关文章

string的简单操作

目录 string的接口说明 构造 constructor operator 迭代器操作 begin( )和end( ) rbegin( ) 和 rend( ) 范围for和迭代器的关系 范围for 迭代器 容量 size lengtn max_size resize capacity reserve clear empty string类的元素访问 operator[ ] at fro…

【Shell脚本12】Shell 输入/输出重定向

Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入&#xff0c;默认情况下&#xff0c;这恰好是你的终端。同样&#xff0c;一个命令通常将其输出写入到标准输出&#xff0c;默…

unity3D scrollview嵌套不能滑动的问题及其解决办法

unity3D scrollview嵌套不能滑动的问题 问题来源&#xff1a; 现在有这么一个需求&#xff0c;有一个页面&#xff0c;希望外面是一个水平方向滑动的scrollView A&#xff0c;A的子对象是一种能在垂直方向滑动的scrollview&#xff0c;此时&#xff0c;如果不做特殊处理&#…

MySQL中全文索引和普通索引的区别

MySQL中的全文索引&#xff08;Full-Text Index&#xff09;和普通索引&#xff08;比如B-Tree索引&#xff09;是为了提高查询效率而设计的&#xff0c;但它们适用于不同的场景和查询类型。 普通索引&#xff08;如B-Tree索引&#xff09; 适用场景&#xff1a;普通索引适用于…

cleer的耳机怎么样?南卡和cleer哪个好?两款开放式耳机深度横评对比

随着开放式耳机的发展&#xff0c;成为许多用户的首选。开放式耳机因其更自然的音质表现和佩戴更舒适体验而备受欢迎。然而&#xff0c;市面上开放式耳机品牌和型号繁多&#xff0c;如何选择一款适合自己的耳机成为了许多用户的难题。 本期文章将为大家推荐两款市面上优秀的开…

【6】Spring Boot 3 集成组件:knift4j+springdoc+swagger3

目录 【6】Spring Boot 3 集成组件&#xff1a;knift4jspringdocswagger3OpenApi规范SpringFox Swagger3SpringFox工具&#xff08;不推荐&#xff09; Springdoc&#xff08;推荐&#xff09;从SpringFox迁移引入依赖配置jAVA Config 配置扩展配置&#xff1a;spring securit…

day26_css

今日内容 零、 复习昨日 一、CSS 零、 复习昨日 HTML - 页面基本骨架结构,内容展现 CSS - 美化页面,布局 JS - 动起来 一 、引言 1.1CSS概念 ​ 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;…

第十九章总结

Java绘图类 Graphics 类 Grapics 类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics 类封装了Java 支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 Graphics 类提供了绘图常用的…

Linux系统编程——进程中vfork函数

函数原型 pid_t vfork(void);//pid_t是无符号整型 所需头文件 #include <sys/types.h> #include <unistd.h> 功能 vfork() 函数和 fork() 函数一样都是在已有的进程中创建一个新的进程&#xff0c;但它们创建的子进程是有区别的。 返回值 成功子进程中返回 …

nginx基本配置-基于nuc980开发板的笔记

一、介绍 前面的文章<nginx交叉编译移植-基于nuc980开发板的笔记>,介绍了如何移植nginx到开发板&#xff0c;打开的网页面是默认的网页。下面介绍如何输入网址变为指定的网页。 二、配置 ①将编写的网页&#xff0c;放到html文件夹下&#xff0c;如下图&#xff1a; ②打…

双点重发布路由策略实验

任务&IP分配如下&#xff1a; 双点重发布实验 第一步&#xff1a;配置IP地址&环回地址 以R1为例&#xff0c;R2、R3、R4同理 interface GigabitEthernet 0/0/0 ip address 12.0.0.1 24 interface GigabitEthernet 0/0/1 ip address 13.0.0.1 24 interface LookBack …

docker 安装xxl-job

1.拉取镜像 docker pull xuxueli/xxl-job-admin:2.4.0 2.docker镜像创建并运行 docker run -e PARAMS"--spring.datasource.urljdbc:mysql://xxxxx:3306/xxl_job?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&serverTimezoneAsia/Shanghai&…

5. HTML中常用标签

5. html常用标签 5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>…

《算法通关村——位运算常用技巧》

《算法通关村——位运算常用技巧》 位运算的性质有很多&#xff0c;此处列举一些常见性质&#xff0c;假设以下出现的变量都是有符号整数。 ●幂等律&#xff1a;a &aa&#xff0c;a ∣ aa&#xff08;注意异或不满足幂等律&#xff09;&#xff1b; ●交换律&#xff1…

WPF xaml Command用法介绍

WPF (Windows Presentation Foundation) 中的命令设计模式是一种用于分离用户界面逻辑和业务逻辑的方法。在WPF中&#xff0c;这种模式通过命令接口&#xff08;如 ICommand&#xff09;实现&#xff0c;使得用户界面组件&#xff08;如按钮、菜单项等&#xff09;可以触发不直…

nodejs+vue电影在线预定与管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

通过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将电影在线预定与管理系统功能模块主要分为管理员模块。 我国各行各业的发展在信息化浪潮的推动下也在不断进步&#xff0c;尤其是电影产业&#xff0c;在人们生活水平提高的同时&#xff0c;从…

联盟 | Quick Creator X HelpLook ,AI助力打造出海企业内容营销

随着人工智能的快速发展&#xff0c;各行各业也加快了人工智能工具的探索&#xff0c;积极将AI融入到行业发展中&#xff0c;出海外贸也不例外。AI渐渐地融入到外贸的各个环节&#xff0c;为企业出海提速增效。 为此&#xff0c;「 Quick Creator 」与 「 HelpLook 」达成战略合…

Leadshop开源商城小程序源码 – 支持公众号H5

Leadshop是一款出色的开源电商系统&#xff0c;具备轻量级、高性能的特点&#xff0c;并提供持续更新和迭代服务。该系统采用前后端分离架构&#xff08;uniappyii2.0&#xff09;&#xff0c;以实现最佳用户体验为目标。 前端部分采用了uni-app、ES6、Vue、Vuex、Vue Router、…

WordPress 媒体库文件夹管理插件 FileBird v5.5.4和谐版下载

FileBird是一款WordPress 按照文件夹管理方式的插件。 拖放界面 拖放功能现已成为现代软件和网站的标配。本机拖动事件&#xff08;包括仅在刀片中将文件移动到文件夹以及将文件夹移动到文件夹&#xff09;极大地减少了完成任务所需的点击次数。 一流设计的文件夹树展示 我们…

图解分布式事务实现原理(一)

参考 本文参考https://zhuanlan.zhihu.com/p/648556608&#xff0c;在小徐的基础上做了个人的笔记。 分布式事务场景 事务核心特性 在聊分布式事务之前&#xff0c;我们先理清楚有关于 “事务” 的定义. 事务 Transaction&#xff0c;是一段特殊的执行程序&#xff0c;其需…