day23【代码随想录】翻转二叉树、对称二叉树、相同的树、另一棵树的子树、完全二叉树的结点个数

news2024/11/23 15:46:19

文章目录

  • 前言
  • 一、翻转二叉树(力扣226)
    • 1、递归法
      • 1、使用前序遍历
      • 2、使用后序遍历
    • 2、迭代法
      • 1、层序遍历
  • 二、对称二叉树(力扣101)
  • 三、相同的树(力扣100)
  • 四、另一棵树的子树(力扣572)
  • 五、完全二叉树的结点个数(力扣222)


前言

1、翻转二叉树
2、对称二叉树
3、相同的树
4、另一棵树的子树
5、完全二叉树的结点个数


一、翻转二叉树(力扣226)

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
在这里插入图片描述

1、递归法

1、使用前序遍历

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

2、使用后序遍历

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

2、迭代法

1、层序遍历

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {return null;}
        ArrayDeque<TreeNode> deque = new ArrayDeque<>();
        deque.offer(root);
        while (!deque.isEmpty()) {
            int size = deque.size();
            while (size-- > 0) {
                TreeNode node = deque.poll();
                swap(node);
                if (node.left != null) {deque.offer(node.left);}
                if (node.right != null) {deque.offer(node.right);}
            }
        }
        return root;
    }
    public void swap(TreeNode root) {
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }
}

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、对称二叉树(力扣101)

给定一个二叉树,检查它是否是镜像对称的。
在这里插入图片描述
前中后序只能采用后序遍历
判断左子树右子树是否可以翻转,并将结果返回给根节点
左为空 右不为空 return false
右为空 左不为空 return false
左为空 右为空 return true
左 右数值不相等 return false
左 右数值相等 进行递归判断下一层结点

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root!=null){
            return true;
        }
        return Compare(root.left,root.right);
    }
    public boolean Compare(TreeNode left,TreeNode right){
        //避免后续出现空指针的情况 所以先处理为空的条件
        if(left==null && right!=null) return false;
        else if(left!=null && right==null) return false;
        else if(left==null && right==null) return true;
        else if(left.val!=right.val) return false;

        //左右“节点”都不为空 且数值相等的情况
        //此时才进行递归 进行下一层判断
        boolean outside = Compare(left.left,right.right);
        boolean inside = Compare(left.right,right.left);

        boolean isSame = outside && inside;
        return isSame; 
    }
}

在这里插入图片描述

三、相同的树(力扣100)

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
在这里插入图片描述
思路:
与第二题一致

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null && q!=null) return false;
        else if(p!=null && q==null) return false;
        else if(p==null && q==null) return true;
        else if(p.val!=q.val) return false;
        //结点不为空且数值相等的情况
        boolean leftside = isSameTree(p.left,q.left);
        boolean rightside = isSameTree(p.right,q.right);
        return leftside && rightside;
    }
}

在这里插入图片描述

四、另一棵树的子树(力扣572)

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
在这里插入图片描述
在这里插入图片描述
思路:
将是否是子树的问题转化为是否相等的问题
判断两个树是否相等的三个条件(与的关系):

  • 当前两个树的根节点值相等;
  • 并且,s的左子树和t的左子树相等;
  • 并且,s的右子树和t的右子树相等
    判断t是否为s的子树的三个条件(或的关系):
  • 当前两棵树相等
  • 或者,t是s的左子树
  • 或者,t是s的右子树
class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        return dfs(root,subRoot);

    }
    public boolean dfs(TreeNode root,TreeNode subRoot){
        if(root==null) return false;
        boolean check = isSame(root,subRoot);
        boolean leftTree = dfs(root.left,subRoot);
        boolean rightTree = dfs(root.right,subRoot);
        return check || leftTree || rightTree;
    }
    public boolean isSame(TreeNode root, TreeNode subRoot){
        if(root==null && subRoot==null) return true;
        else if(root==null && subRoot!=null) return false;
        else if(root!=null && subRoot==null) return false;
        else if(root.val!=subRoot.val) return false;

        //根节点不为空且数值相等
        boolean left = isSame(root.left,subRoot.left);
        boolean right = isSame(root.right,subRoot.right);
        return left && right;
    }
}

在这里插入图片描述

五、完全二叉树的结点个数(力扣222)

给出一个完全二叉树,求出该树的节点个数。
在这里插入图片描述
把完全二叉树当做一棵普通的二叉树
可以用前中后层序遍历去统计结点数目

class Solution {
    public int countNodes(TreeNode root) {
        //后序遍历
        if(root==null)return 0;
        int leftNum = countNodes(root.left);
        int rightNum = countNodes(root.right);
        return leftNum+rightNum+1;

    }
}

利用完全二叉树特性
在这里插入图片描述
较难理解

class Solution {
    public int countNodes(TreeNode root) {
        //后序遍历
        // if(root==null)return 0;
        // int leftNum = countNodes(root.left);
        // int rightNum = countNodes(root.right);
        // return leftNum+rightNum+1;

        //完全二叉树特性
        if(root==null) return 0;
        TreeNode leftNode = root.left;
        TreeNode rightNode = root.right;
         int leftDepth = getDepth(root.left);
        int rightDepth = getDepth(root.right);
        if(leftDepth==rightDepth){//说明是满二叉树
            return (1 << leftDepth) + countNodes(root.right);
        }else {// 右子树是满二叉树
            return (1 << rightDepth) + countNodes(root.left);
        }
    }

        private int getDepth(TreeNode root) {
        int depth = 0;
        while (root != null) {
            root = root.left;
            depth++;
        }
        return depth;
    }
}

在这里插入图片描述


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

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

相关文章

[附源码]Nodejs计算机毕业设计教师信息采集系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

docker容器中DPDK对网卡SR-IOV支持实验

主要是验证下容器运行DPDK&#xff0c;如何对SR-IOV进行支持 1 VF创建方法 在未开启SR-IOV时&#xff0c;通过DPDK提供的./dpdk-devbind.py脚本可知&#xff0c;当前系统一共有一块82599网卡&#xff0c;拥有2个网口&#xff0c;PCI的地址是18:00.0和18:00.1,如下图所示 启用…

华为配置动态路由ISIS协议

华为配置动态路由ISIS协议一、路由基础知识二、路由器配置接口IP地址&#xff08;一&#xff09;配置R1、R2、R3网络&#xff08;二&#xff09;配置R1、R2、R3环回网络接口&#xff08;三&#xff09;测试直连网络三、启动进程号&#xff0c;配置实体名称&#xff08;一&#…

JVM之堆

堆的基本内容&#xff1a; Java堆&#xff08;Java Heap&#xff09;是虚拟机所管理的内存中最大的一块&#xff0c;Java堆是被所有线程共享的一块内存区域&#xff0c;在虚拟机启动时创建&#xff0c;此内存区域的唯一目的就是存放对象实例&#xff0c;Java 世界里“几乎”所…

【每日挠头算法题】Leetcode 989. 数组形式的整数加法 —— 高精度加法解法

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;每日挠头算法题 文章目录一、题目描述二、思路及代码实现今天为大家带来的是力扣上的一道简单题&#xff1…

Spring的秒表StopWatch优雅的程序计时器 -第455篇

历史文章&#xff08;文章累计450&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 走进MyBatis源码一探Spring扩展点「知识…

排水监测传感器数据采集传感节点接入网关产品介绍

一、产品概述 传感节点接入网关是一款工业级网关&#xff0c;可将Modbus RTU协议的设备数据转换为MQTT协议格式再远传至数据中心&#xff0c;支持采集数字量输入信号&#xff0c;支持输出数字量控制信号。 传感节点接入网关具备一体化采集、传输、控制功能&#xff0c;集成了…

IDEA自定义JavaDOC注释模板

文章目录IDEA自定义JavaDOC注释模板方法注释模板1、创建模板2、设置模板内容-JavaDoc格式3、Define4、Edit VariablesIDEA自定义JavaDOC注释模板 JavaDOC注释模板共分为两种&#xff1a; 类注释模板方法注释模板 方法注释模板 1、创建模板 File–>Settings–>Editor…

FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence

FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence, NIPS, 2020 要点&#xff1a; 1、首先&#xff0c;基于 “弱增强的未标记样本的模型预测” 生成伪标签&#xff1b;接着&#xff0c;对于给定的样本&#xff0c;只有模型预测的置信度高时&a…

详细复习云开发~小程序【云存储、云函数】

文章目录一&#xff0c;云开发~云存储1-1&#xff0c;云开发控制台管理文件1-2&#xff0c;上传图片到云存储1-3&#xff0c;给商品列表加商品图片1-4&#xff0c;上传视频到云存储1-5&#xff0c;上传word&#xff0c;excel文件到云存储1-5-1&#xff0c;上传之前先选择文件1-…

mybatis if test对Intger判空的坑、原理及解决方法

文章目录问题描述源码分析解决方法问题描述 Mybatis在进行<if test"status! null and status! ">非空判断操作时&#xff0c;如果status为0的时候&#xff0c;该判断条件的值为false 写法如下&#xff1a; <select id"countByBySearchCondition&quo…

提取任意开始年月日到结束年月日中间的所有日期和星期

&#x1f37f;*★,*:.☆欢迎您/$:*.★* &#x1f37f; 分为三种情况 1 同年同月不通日 2 同年不同月 3不同年 不同年分为 两种情况 一种是开始年 开始年月不是12月的要单独计算 一种是结束年 结束年要不是1月的要单独计算 同时每种情况结尾天数分割也不同 #!/usr/bin/python # …

玉湖冷链首次参展中国冷链产业年会

洞见时代&#xff0c;探冬寻暖。12月15-17日&#xff0c;「2022第十六届中国冷链产业年会」在厦门举行。玉湖冷链深度参与行业盛会&#xff0c;首次设展&#xff0c;与上千名行业人士进行了深入交流&#xff0c;并参与了中物联冷链委四届三次理事会和主论坛首席对话等环节。 年…

JaveWeb框架(二):Servlet组件入门

Servlet入门 MVC实战项目 仓储管理系统Servlet 入门DemoServlet 执行流程、生命周期执行流程生命周期Servlet API介绍Servlet体系结构Servlet urlPattern配置Servlet&#xff1a;请求与响应Request&#xff1a;请求请求的构成请求API方法来获取对应的值:请求参数的获取方式请求…

后台系统权限流程

菜单管理 角色管理 相关逻辑 <template><div><a-tree :checkable"true"check"handlerChecked"select"handlerSelectNode"/></div> </template><script> export default { data(){return {// 选中节点的ke…

宠物领养网站

成品详细信息 开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 基于java的宠物领养管理系统用户模块包括注册登录、个人信息管理、 可领养宠物信息查询、宠物助养信息查…

Java注册登录及邮箱发送账号激活(主要技术栈SpringBoot,MyBatis)

文章目录前言学习之前需要掌握的知识项目环境搭建数据库的搭建前端页面的搭建后端代码格式pojomapperControllerservice最后前言 项目流程图如下&#xff1a; 这里我们通过&#xff1a; 163邮箱来实现激活码发送qq邮箱来进行接收 学习之前需要掌握的知识 springboot的基本使…

解决tinypng 1.0.6 在线压缩C#接口报ssl错误的方法

因为作者的做法是使用了他们的证书, 但是如果是插件引用, 感觉是无法调用的. 所以我们直接下载code 修改这里即可 namespace TinifyAPI.Internal internal static class SSL public static bool ValidationCallback(HttpRequestMessage req, X509Certificate2 cert, X509Chain…

二十四节气-冬至,海报/文案分享,一口饺子,一口吉。

古说&#xff0c;冬至是阴极之至 阳气始生&#xff0c;有冬至大如年的说法 冬至到&#xff0c;家家户户吃水饺&#xff0c; “冬至不端饺子碗&#xff0c;冻掉耳朵没人管” “三九补一冬&#xff0c;来年无病痛” 可吃羊肉等温补…… 一组超级好的大牌文案 真心秀色可餐 下面是…

selenium自动化测试——unittest框架

文章目录unittestunittest 框架组成细节unittest测试示例用例的执行顺序忽略测试用例的执行unittest断言HTML报告生成生成HTML报告步骤异常捕捉与错误截图数据驱动unittest unittest 是python 的单元测试框架&#xff0c; 在python 的官方文档中&#xff0c;对unittest有详细的…