【java数据结构-二叉树详解(下)带你手撕对称二叉树等难题(附题目链接)】

在这里插入图片描述

🌈个人主页:努力学编程’
个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解
学好数据结构,刷题刻不容缓:点击一起刷题
🌙心灵鸡汤总有人要赢,为什么不能是我呢
在这里插入图片描述

hello 大家好啊,前两天给大家写了关于二叉树的一些知识点,上次也说过了,二叉树是非常重要的数据结构,必须熟悉二叉树的基本知识,并学会对二叉树的一些基本操作,博主下去把上次讲的二叉树的知识,做成了一个思维导图,今天带大家刷几道二叉树的题,如果那块知识有问题,可以顺着思维导图看看,也可以看看我的上一篇文章【java数据结构-二叉树(上)】.

在这里插入图片描述

二叉树相关的算法题

🚀检查两颗树是否相同

解题思路:我们知道二叉树的结构非常的简单,大体可以分为数值和数的结构构成,而且我们上次说过二叉树的核心就是递归所以,我们这里要两个树相同,可以这样想两棵树的根节点的值和结构一样,并且左子树和右子树的结构和值一样。

在这里插入图片描述

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;
        }
        //两棵树的节点的值不相同,就不相同
        if(p.val!=q.val){
            return false;
        }
        //保证左右子树的节点结构和值相同
        return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
    }
}

另一颗树的子树

解题思路:如何判断这两棵树是否存在子树的关系呢,这里直接思考整个过程可能有点难度,我们可以从·特殊情况入手,比如两棵树如果一模一样的话,那么此时当然也满足子树的条件,此时就是我们上一道题的解题过程,如果不一样的话,由于两棵树都不为空,所以我们不必考虑为空的情况,接下来,我们就需要判断root中包含subRoot的情况了。

在这里插入图片描述
直接上代码:

class Solution {
    public boolean isSubtree(TreeNode root,TreeNode subRoot){
        if(root==null){
            return false;
        }
        if(isSameTree(root, subRoot)){
            return true;
        }
        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;
        }
        if(p.val!=q.val){
            return false;
        }
        return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
    }
}

翻转二叉树

解题思路:对于二叉树的翻转,我们可能比较陌生,但这个题其实是最简单的,思路也比较直接,翻转二叉树首次翻转头结点的左子树和右子树,然后翻转左子树节点的左右子树,和右子树的左右子树如此递归就完成了二叉树的翻转。

在这里插入图片描述
直接上代码:

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

判断一颗二叉树是否是平衡二叉树

解题思路:首先你得知道什么是平衡二叉树,即这棵树的所有节点对应的左子树和右子树的差值必须小于等于1,否则就不是平衡二叉树。一棵树如果是平衡二叉树,那它的头结点的左子树和右子树的长度之差必须小于等于1,同时对应的左子树和对应的右子树必须也是平衡二叉树,好了现在又引出了一个新的问题,如何获取子树的长度,仔细思考,我们还得编写一个求长度的方法,求一棵树的长度就是我们一直求左子树和右子树长度然后比较求出较长的树的长度,加上头结点即1就求出了长度

在这里插入图片描述

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null) return true;

        int leftH = maxDepth(root.left);
        int rightH = maxDepth(root.right);

        return Math.abs(leftH - rightH) <= 1
                && isBalanced(root.left)
                && isBalanced(root.right);
    }
    public int maxDepth(TreeNode root) {
        if(root == null) {
            return 0;
        }
        int leftHeight = maxDepth(root.left);
        int rightHeight = maxDepth(root.right);

        return leftHeight > rightHeight ?
                leftHeight+1:rightHeight+1;
    }
}

对称二叉树

同样我们先要理解对称二叉树的概念,对称二叉树,即以每棵树的头结点为对称点左右两边的树的结构和数值都是一致的,大家仔细品味这句话,基本上已经把对称二叉树的概念说的很明白了,同样的头结点对应的左右子树要对称,而此时的左右子树也要是对称二叉树,接着就一直递归下去,知道结束。

在这里插入图片描述
上代码

class Solution {
    public boolean isSymmetric(TreeNode root){
        if(root==null){
            return true;
        }
        return isSymmetricChild(root.left,root.right);
    }
    public boolean isSymmetricChild(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 isSymmetricChild(leftTree.left,rightTree.right)
                &&isSymmetricChild(leftTree.right,rightTree.left);
    }
}

结语

今天就带大家学习这么多的东西了,关于二叉树,其实还有很多难度更大的题目,在此之前一定要把二叉树的基本知识了解清楚,理解二叉树中的递归过程,多多画图理解,最后一定要及时总结哦~~~,期待你的一键三连!!!
在这里插入图片描述

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

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

相关文章

正则问题【蓝桥杯】/dfs

正则问题 dfs 刚开始用的是栈&#xff0c;没有想到dfs… #include<iostream> #include<stack> using namespace std; string s; int pos; int dfs() {//ans表示到当前位置最多的x数目//num表示暂存的x数目int num0,ans0;while(pos<s.size()){if(s[pos](){pos;…

蓝桥杯-【二分】肖恩的苹果林

思路:有点类似于找最大值的最小化。 代码及解析 常规的模板引用40% #include <bits/stdc.h> using namespace std; #define ll long long const ll N1e53; ll a[N]; ll m,n; ll chack(ll mid) {int res1,last0;for(int i1;i<n;i){ if(a[i]-a[last]>mid){res;las…

秋招算法刷题6

20240408 1.两数之和 &#xff08;时间复杂度是O&#xff08;n的平方&#xff09;&#xff09; public int[] twoSum(int[] nums, int target){int nnums.length; for(int i0;i<n;i){ for(int j1;j<n;j){ if(nums[i][j]target){ …

大型央国企“信创化”与数字化转型建设思路

一、央国企信创化与数字化转型时代背景 1、信创概念普及&#xff1a; 信创&#xff0c;即“信息技术应用创新”。是我国自主信息产业聚焦的核心&#xff0c;旨在通过对IT硬件、软件等各个环节的重构&#xff0c;基于我国自有IT底层架构和标准&#xff0c;形成自有开放生态&am…

使用Mac自带终端进行远程ssh连接Linux服务器

废话不多说&#xff0c;直接上图 好吧&#xff0c;我承认我是多此一举&#xff0c;脱裤子放pi了&#xff0c;其实只需要在终端输入一行命令就可以了&#xff08;呜呜&#xff5e;&#xff09; ssh rootip -p 22 需要注意的是&#xff0c;命令里的ip地址同样要替换成你自己的服…

【并发】第四篇 AtomicInteger原子操作

导航 一. 简介二. 源码分析三. 原子操作原理三. 实际用途1. 标志位2. 唯一标识生成器3. 计数器一. 简介 AtomicInteger是Java中提供的一种线程安全的原子操作类,用来实现对整数类型的原子操作。它可以在多线程环境下保证对整数的原子性操作,而不需要使用synchronized关键字或…

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量…

抖店运营没有销量?想要快速拉高,产品部分一定做好!

大家好&#xff0c;我是电商小布。 我们开通抖音小店&#xff0c;运营店铺的最终目的&#xff0c;都是为了顺利实现转化。 但是有的小伙伴在开店运营之后&#xff0c;发现自己的店铺在销量上并没有什么起色在。 出现这个情况是怎么回事呢&#xff1f; 之前就有给大家说过&a…

寻找伙伴/拓展业务/开拓市场 2024CBTC上海国际储能展,为您提供海量商机!

在全球能源转型的背景下&#xff0c;电力市场正在经历一场前所未有的大变革&#xff0c;以储能为核心的新型电力系统建设正成为能源转型的重要抓手&#xff0c;给电力及新能源行业带来更多机遇。 由湖南省电池产业协会、中国设备管理协会、沪粤储能产业联盟、深圳国际投融资商…

零售行业数字化广告评价标准 - 《IAB/MRC零售(广告)测量指南》

IAB/MRC零售&#xff08;广告&#xff09;测量指南 --- 最新标准&#xff0c;2024年1月发布 目录 1出台此标准的目的是什么&#xff1f;2标准宗旨3本标准的主要关键领域4为什么这对品牌和零售商很重要5能给零售媒体中小型玩家带来什么机会&#xff1f;6评价零售媒体效果的最…

React - 你知道useffect函数内如何模拟生命周期吗

难度级别:中级及以上 提问概率:65% 很多前端开发人员习惯了Vue或者React的组件式开发,熟知组件的周期过程包含初始化、挂载完成、修改和卸载等阶段。但是当使用Hooks做业务开发的时候,看见一个个useEffect函数,却显得有些迷茫,因为在us…

人工智能的分类有哪些

人工智能&#xff08;AI&#xff09;可以根据不同的分类标准进行分类。以下是一些常见的分类方法&#xff1a; 1. **按功能分类**&#xff1a; - 弱人工智能&#xff08;Narrow AI&#xff09;&#xff1a;也称为狭义人工智能&#xff0c;指专注于执行特定任务的AI系统&…

富文本编辑器的下载安装使用

为什么选择vue-quill-editor&#xff1f; 在众多的富文本编辑器中&#xff0c;vue-quill-editor因其易用性、灵活性以及对Vue框架友好的特性而受到开发者的青睐。它基于Quill编辑器&#xff0c;Quill是一款现代的WYSIWYG&#xff08;所见即所得&#xff09;编辑器&#xff0c;…

GFS分布式文件系统概述以及集群部署

一.简介 GlusterFS 是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba存储网关(可选&#xff0c;根据需要选择使用)组成。没有元数据服务器组件&#xff0c;这有助于提升整个系统的性能、可靠性和稳定性。 传统的分布式文件系统大多通过元服务器来存储元数据&a…

嵌入式路由器:支持Vxlan功能,四大运营商网络

SR830-E系列产品&#xff0c;是集 4G/5G 网络、虚拟专用网等 技术于一体的物联网无线路由器产品。多DNN网络切片功能&#xff0c;满足行业应用差异化需求提供网络级的SLA保障及E2E安全隔离。该设备支持Vxlan功能&#xff0c;实际二层交换组网。为数据中心提供良好的解决方案。 …

西圣PK飞利浦PK漫步者开放式耳机值得选购吗?热门爆款品牌测评对比PK

开放式耳机因其独特的音质体验与佩戴舒适度&#xff0c;正逐渐成为消费者追求音乐品质与生活品质的重要选择&#xff0c;而在众多开放式耳机品牌中&#xff0c;万魔、飞利浦与漫步者在开放式耳机市场争议火热&#xff0c;这三大品牌开放式耳都值得购买吗&#xff1f;作为一个测…

C++进阶之路---何为智能指针?

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f;提示一下&am…

Z变换与传递函数代码化

对于自动控制而言&#xff0c;其关键在于传递函数方程&#xff0c;根据其特性设计出控制器&#xff0c;控制器也是S域的传递函数&#xff0c;那么如何将传递函数用代码的形式表现出来呢&#xff1f;以下将介绍这种工程方法 1、Z变换 对于一个确定的传递函数&#xff0c;如下 …

【知识面拓展】:前瞻性

前瞻性 AUTOSEMO大陆集团博士其他 AUTOSEMO AUTOSEMO&#xff0c;中国汽车基础软件生态委员会 . 车企、软件、芯片等各嘉宾观点 . 国产芯片之&#xff1a;芯驰科技构建智能汽车数字化生态平台 . 国产软件之&#xff1a;经纬恒润的全栈思考 大陆集团 大陆集团新闻稿链接 . 1、2…

✌2024/4/3—力扣—最长回文子串

代码实现&#xff1a; 解法一&#xff1a;动态规划——回文子串 char* longestPalindrome(char *s) {int n strlen(s);if (s NULL || n 0 || n 1) {return s;}int dp[n][n];memset(dp, 0, sizeof(dp));for (int i n - 1; i > 0; i--) { // 从下到上for (int j i; j &l…