二叉树的递归问题

news2024/11/29 11:38:07

目录

 一、相同的树

二、另一棵树的子树

三、翻转二叉树

四、平衡二叉树

五、对称二叉树


一、相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

 首先判断两个相同的树要先判断他的根节点,如果q和p的根节点都为空,那么他俩是相同的返回true;如果q为空p不为空或者p为空q不为空则不相同返回false;如果两者都不是空的那么就需要比较两者的val如果相等,那么可以进行下一步比较比较它们的左右子树,如果最后返回的都是true才是相同的树,只要有一个是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);
    }

二、另一棵树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

 

 先判断树根root和subRoot是否是相同的树,若是直接return true;否则判断左子树是否包含subRoot或在右子树中是否包含subRoot,只要有一个子树中有包含关系则返回true。

所以在这道题中我们需要用到第一道题的isSameTree方法,用于第一步判断 树根root和subRoot是否是相同的树。

这两道题都是前序遍历的问题,都是从跟结点出发。

    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root==null&&subRoot==null){
            return true;
        }
        if(root==null||subRoot==null){
            return false;
        }
        if(isSameTree(root,subRoot)){
            return true;
        }
        return isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot);
    }
    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 ,翻转这棵二叉树,并返回其根节点。

先将所有子树翻转完毕,最后交换2和7两个的顺序。

 这个方法采用后续遍历,首先先判断树是否为空或者只有一个结点,这两种情况都不需要再进行翻转,直接返回root即可。然后我们先进行子树的翻转,最后在交换处理后的左右子树即可。然后返回根节点。

首先我们进入整个方法,判断递归结束条件不满足后,往下走,走到root.left = invertTree(root.left); 这时root的树是如图1所示的,

紧接着在进入root.left = invertTree(root.left); 这时root树入图2所示,这时他只有一个结点,所以返回root。

然后我们进入root.right = invertTree(root.right);这时图3就是现在的root,这时也只有一个结点所以返回root。

然后我们就进入将根节点为2的数翻转的操作。翻转成功后如图4,然后返回root。

图1
图1
图2
图3
图4

 

 

 

 紧接着对根节点的右子树进行翻转,反转后的结果如下。

 最后回到根节点,将上述两个反转好的左右子树根节点在进行翻转,就得到了整个二叉树的翻转。

    public TreeNode invertTree(TreeNode root) {
        if (root == null || (root.left == null && root.right == null)) {
            return root;
        }
        root.left = invertTree(root.left);
        root.right = invertTree(root.right);
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        return root;
    }

四、平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

 首先排除掉树为空和只有一个节点的情况,这两种情况一定是平衡树。

然后利用求树的高度的方法,求出左子树和右子树的高度差值是否小于等于一,如果满足条件那么继续递归查看左子树和右子树这两棵树是否也满足平衡树的条件;如果大于一那么直接返回false。

    public boolean isBalanced(TreeNode root) {
        if (root==null||(root.left==null&&root.right==null)){
            return true;
        }
        int leftHeight = height(root.left);
        int rightHeight = height(root.right);
        int abs = Math.abs(leftHeight-rightHeight);
        if(abs>1){
            return false;
        }
        return isBalanced(root.right)&&isBalanced(root.left);
    }
    public int height(TreeNode root){
        if(root==null){
            return 0;
        }
        if(root.left==null&&root.right==null){
            return 1;
        }
        return 1+Math.max(height(root.left),height(root.right));
    }

五、对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

 首先系统规定这个树不是空树,所以我们直接创建一个方法isMirror来判断树的左右子树是否是镜像的,直接传入root.left,root.right。

若t1==null&&t2==null那么一定是镜像的,所以返回true,排除这个之后如果t1==null||t2==null,那么一定有一个非空则不是镜像的则返回false。接下来如果t1.val != t2.val,那么也不是镜像的直接返回false,当这三个条件都结束后,则对t1.left和t2.right、t1.right和t2.left在进行镜像对比。

所以首先进入isMirror方法t1和t2如图所示,他们两个的值相等,满足进入递归的条件,则对比他们的左右节点的镜像关系。

 isMirror(t1.left, t2.right) 和isMirror(t1.right, t2.left)调用递归的t1和t2分别如下图所示,对比他们是否为镜像关系。

如果都为镜像关系那么整个树就是对称的。

    public boolean isSymmetric(TreeNode root) {
          return isMirror(root.left,root.right);
    }
    public boolean isMirror(TreeNode t1,TreeNode t2) {
          if(t1==null&&t2==null){
              return true;
          }
          if(t1==null||t2==null){
              return false;
          }
        if (t1.val != t2.val) {
            return false;
        }
        return isMirror(t1.left, t2.right) && isMirror(t1.right, t2.left);
    }

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

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

相关文章

【毕业设计-课程设计】-超声波测距

资源链接在文章最后,订阅查看获取全部内容及资料,如需可私信提供硬件。 目 录 1 绪论 2 1.1 项目研究背景及意义 2 2 总体设计方案及论证 2 2.1 总体方案设计 2 3 硬件实现及单元电路设计 3 3.1 主控制模块 3 3.2 电源设计 4 3.3 超声波测试模块 4 3.3.1 超声波的特性 5 3.3…

【Python】顺序、条件、循环语句

文章目录一. 顺序语句二. 条件语句1. 什么是条件语句2. 缩进和代码块3. 空语句 pass4. 练习三. 循环语句1. while 循环2. for 循环一. 顺序语句 默认情况下,Python 的代码执行顺序,是从上到下依次执行的: 执行结果一定为 “123”&#xff0…

【工具门户】Backstage配置使用PostgreSQL(三)

先决条件 If the database is not hosted on the same server as the Backstage app, the PostgreSQL port needs to be accessible (the default is 5432 or 5433) PostgreSQL数据库默认端口为5432或5433,如果数据库与Backstage应用不在同一台机器上,需开放PostgreSQL端口…

MyBatis框架一二级缓存含代码演示

目录 1.什么是缓存? 2. Mybatis的一级缓存 2.1实验一: 2.2实验二: 3.Mybatis的二级缓存 3.1 二级缓存需要配置才可以使用: 3.2 实验开始!! 4.总结 1.什么是缓存? 缓存就是数据交换的缓冲区(称作Cache),当某一…

学习Python中turtle模块的基本用法(2:基本绘图函数测试)

个人感觉turtle模块中的绘图函数是按人手拿着画笔一笔一画地画图的思路定义的,这与C#中的GDI函数、html5中canvas的绘图函数及Tkinter中Canvas的绘图函数的定义思路存在差异,但也能完成后面绝大部分的绘图功能(目前看到的turtle文章及帮助文档…

安装OpenGL

提示错误信息: (base) C:\Users\Tina\PycharmProjects\FunnyToys-main>conda install opengl Collecting package metadata (current_repodata.json): done Solving environment: failed with initial frozen solve. Retrying with flexible solve. Collecting…

python 栈空间不足异常 Process finished with exit code: -1073741571

问题现象 在pycharm使用debug模式调试代码时,异常退出,且错误码为-1073741571。除了错误码外,并没有看到其它报错。 分析 查阅资料: Process finished with exit code -1073741571 (0xC00000FD) when trying to implement ab…

AxureRP9的新特性介绍和技巧分享

AxureRP自去年8月第一个测试版本发布以来,已经一年多了,官方版本已经发布了近半年,但这个版本的用户声誉是褒贬不一的。许多用户反馈了他们对新版本的喜欢和肯定,但一些老用户仍然不愿意接受它,甚至保持抵制。 根据我…

【Hack The Box】linux练习-- Tabby

HTB 学习笔记 【Hack The Box】linux练习-- Tabby 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月22日🌴 &#x1f36…

【数据结构】基础:二叉树

【数据结构】基础:二叉树基础 摘要:本文将会介绍二叉树的基础内容,首先引入树的概念,了解树的基本概念与性质,再对二叉树的概念和性质进行分析,最后对其方法进行实现,最重要的是理解对于二叉树方…

世界65个国家贸易开放度数据 2005-2019年

一、数据介绍 数据名称:UNtrade数据库 数据年份:2005-2019年 数据范围:世界65个国家 数据来源:各地方统计局 部分数据如下: 二、参考文献 用途:研究人民币实际汇率与贸易差额之间的关系等。 [1]卢向…

R语言文本挖掘tf-idf,主题建模,情感分析,n-gram建模研究

数据集中的Usenet公告板包括新汽车,体育和密码学等主题。最近我们被客户要求撰写关于主题建模的研究报告,包括一些图形和统计输出。我们对20个Usenet公告板的20,000条消息进行分析。 相关视频:文本挖掘:主题模型(LDA&a…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.1 记录系统访客独立IP访问次数案例介绍

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.1 记录系统访客独立IP访问次数案例介绍2.1.1 介绍2.1.2 需求…

SpringCloud 组件Gateway服务网关【断言工厂过滤器工厂】

目录 1:断言工厂 2:过滤器工厂 2.1:路由过滤器的种类 2.2:请求头过滤器 2.3:默认过滤器 2.4:总结 1:断言工厂 路由断言工厂Route Predicate Factory 路由配置包括: 1. 路由…

C++_串口编程_官方示例:监视通信事件

这是微软官方的一个例子,这个例子中,如果不做修改,那么他是可以异步运行的,会出现一个错误:官方也说了一下,但是不太好懂,我拷贝过来放在这里,作为参考。 如果无法立即完成重叠的操作…

1_MyBatis入门

原生JDBC实现CURD的问题 1 编码繁琐 2 需要我们自己将结果集映射成对象 3 性能不太好 连接池 缓存 4 SQL语句和java代码的耦合度特别高 5 … … MyBatis 本是Apache的一个开源项目iBatis, 2010年这个项目由Apache Software Foundation 迁移到了Google Code,且改名为…

python学习笔记(10)

目录 第八章 函数 1.模块化程序设计(模块化---封装、复用、可替代) 2.定义函数 3.函数调用 4.return语句 5.函数参数 6.变量作用域 7.函数的递归调用 8.匿名函数 9.迭代器 10.生成器 11.装饰器 第八章 函数 1.模块化程序设计(…

【线性表】—不带头单向非循环链表的增删查改

小菜坤日常上传gitee代码:https://gitee.com/qi-dunyan(所有的原码都放在了我上面的gitee仓库里) 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介:双一流非科班的一名小白,期待与各位大佬一起努…

dns网络服务器未响应是什么原因(如果各自方法都尝试后无法使用,请尝试重启猫)

事件起因:周六晚上,看法国对丹麦世界杯,突然网页浏览器无法工作。 1.然后尝试修改dns路由修改为114.114.114.114,又还原system32/driver/hosts仍然无法使用 2.查看是否有浏览器代理,查询无 3.查看是否有可疑进程&…

游戏开发24课 cocoscreator scrollview优化

分享一个 ScrollView 优化组件 增加一个 在线演示地址 显得高大上一点 image.png32762116 263 KB 目前支持的功能 水平/垂直滑动 可变尺寸动态更新 平滑滚动到底部 Grid 正序排列、倒序排列 无限循环滚动 单向、双向 下拉刷新 (只是这么叫 实际上就是两种类型…