代码随想录算法训练营Day14 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

news2024/11/23 15:34:10

目录

226.翻转二叉树

101. 对称二叉树

104.二叉树的最大深度

111.二叉树的最小深度

226.翻转二叉树

题目

226. 翻转二叉树 - 力扣(LeetCode)

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

示例1:

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

在这里插入图片描述

示例2:

输入:root = []
输出:[]

提示:

  • 树中节点数目范围在 [0, 100]
  • -100 <= Node.val <= 100

思路

视频讲解:LeetCode:226.翻转二叉树

代码随想录:226.翻转二叉树

想要翻转一颗二叉树,只需要把每一个节点的左右孩子都翻转一下,即可获得整体翻转的效果。

使用递归法时可以选择使用前序遍历或者后序遍历,前序遍历过程如下:

翻转二叉树

此外,还可以使用层序遍历。

题解

递归法:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        return invert(root);
    }

    TreeNode invert(TreeNode root) {
        if (root == null)
            return root;
        if (root.left != null)
            invert(root.left);
        if (root.right != null)
            invert(root.right);
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        return root;
    }
}

层序遍历:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        Deque<TreeNode> deque = new ArrayDeque<>();
        if (root == null)
            return root;
        deque.offer(root);
        while (!deque.isEmpty()) {
            int size = deque.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = deque.poll();
                TreeNode tmp = node.left;
                node.left = node.right;
                node.right = tmp;
                if (node.left != null)
                    deque.offer(node.left);
                if (node.right != null)
                    deque.offer(node.right);
            }
        }
        return root;
    }
}

101. 对称二叉树

题目

101. 对称二叉树 - 力扣(LeetCode)

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

示例1:

输入:root = [1,2,2,3,4,4,3]
输出:true

img

示例2:

输入:root = [1,2,2,null,3,null,3]
输出:false

img

提示:

  • 树中节点数目在范围 [1, 1000]
  • -100 <= Node.val <= 100

思路

代码随想录:101.对称二叉树

视频讲解:LeetCode:101. 对称二叉树

如果一棵二叉树是对称的,其根节点的左子树和右子树是镜像对称的,所以本题需要比较根节点的左右子树是否对称。

递归法:

  1. 先确定递归方法的参数为左子树和右子树中相对应的节点,返回值为布尔类型。
  2. 确定中止情况:左右两个节点都为空时,对称;左右两个节点其中一个为空时,不对称;左右两个节点值不同时,不对称。
  3. 比较两次,一次比较外侧的两个节点,一次比较内侧的两个节点。

迭代法:每次迭代时将左右两侧对应的节点一起放入队列中,每次取两个队列中的元素出来进行比较。

题解

递归法:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left, root.right);
    }

    boolean compare(TreeNode left, TreeNode right) {
        if (left == null && right == null)
            return true;
        if ((left == null && right != null) || (left != null && right == null))
            return false;
        if (left.val != right.val)
            return false;
        boolean out = compare(left.left, right.right);
        boolean in = compare(left.right, right.left);
        return out == true && in == true;
    }
}

迭代法:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offer(root.left);
        deque.offer(root.right);
        while (!deque.isEmpty()) {
            TreeNode left = deque.poll();
            TreeNode right = deque.poll();
            if (left == null && right == null)
                continue;
            if (right == null || left == null || left.val != right.val)
                return false;
            deque.offer(left.left);
            deque.offer(right.right);
            deque.offer(left.right);
            deque.offer(right.left);
        }
        return true;
    }
}

104.二叉树的最大深度

题目

104. 二叉树的最大深度 - 力扣(LeetCode)

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例1:

输入:root = [3,9,20,null,null,15,7]
输出:3

在这里插入图片描述

思路

视频讲解:LeetCode:104.二叉树的最大深度

代码随想录:104.二叉树的最大深度

此题除了层序遍历之外,还可以使用递归法。

树的深度等于左子树深度和右子树深度中的最大值+1。

  • 递归终止条件:当前节点为空。

  • 找出返回值:节点为空时说明子树高度为 0,返回 0,节点不为空时则分别求左右子树的高度,取两者中的最大值加 1 表示当前节点的高度,返回该数值。

题解

层序遍历:

class Solution {
    public int maxDepth(TreeNode root) {
        int res = 0;
        Deque<TreeNode> deque = new ArrayDeque<>();
        if (root == null)
            return res;
        deque.offer(root);
        while (!deque.isEmpty()) {
            int size = deque.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = deque.poll();
                if (node.left != null)
                    deque.offer(node.left);
                if (node.right != null)
                    deque.offer(node.right);
            }
            res++;
        }
        return res;
    }
}

递归法:

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        } else {
            int left = maxDepth(root.left);
            int right = maxDepth(root.right);
            return Math.max(left, right) + 1;
        }
    }
}

111.二叉树的最小深度

题目

视频讲解:LeetCode:111.二叉树的最小深度

代码随想录:111.二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例1:

输入:root = [3,9,20,null,null,15,7]
输出:2

在这里插入图片描述

提示:

  • 树中节点数的范围在 [0, 105]
  • -1000 <= Node.val <= 1000

思路

代码随想录:111.二叉树的最小深度

除了层序遍历,还可以使用递归法,对于每一个非叶子节点,分别计算其左右子树的最小叶子节点深度。

题解

层序遍历:

class Solution {
    public int minDepth(TreeNode root) {
        int res = 0;
        Deque<TreeNode> deque = new ArrayDeque<>();
        if (root == null)
            return res;
        deque.offer(root);
        res++;
        while (!deque.isEmpty()) {
            int size = deque.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = deque.poll();
                if (node.left == null && node.right == null)
                    return res;
                if (node.left != null)
                    deque.offer(node.left);
                if (node.right != null)
                    deque.offer(node.right);
            }
            res++;
        }
        return res;
    }
}

递归法:

class Solution {
    public int minDepth(TreeNode root) {
        if (root == null)
            return 0;
        if (root.left == null && root.right == null)
            return 1;
        int min = Integer.MAX_VALUE;
        if (root.left != null)
            min = Math.min(minDepth(root.left), min);
        if (root.right != null)
            min = Math.min(minDepth(root.right), min);
        return min + 1;
    }
}

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

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

相关文章

Android下反调试与反反调试

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 反调试检测 反调试检测的几种方式。 1. TrackerId 首先&#xff0c;通过 IDA Pro 的调试器附加到当前 app 进程 关于IDA Pro调试android app的详细教程可以…

必应广告投放推广收费标准和流程

在当今竞争激烈的商业环境中&#xff0c;如何精准高效地推广产品与服务&#xff0c;成为企业面临的重大挑战。微软必应Bing广告平台&#xff0c;凭借其强大的技术实力和精准的数据分析能力&#xff0c;已成为众多企业广告推广的首选。云衔科技作为业界领先的数字化营销服务商&a…

【机器学习-无监督学习】聚类

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

安卓系统升级后,关于Fiddler工具不能抓取https接口问题

问题原因&#xff1f; 目前安卓手机可以抓取的https接口都在安卓7.0版本以下&#xff0c;有时候抓取Android7.0版本或以上的接口抓取不到 因为Android7.0之后常规手段不能抓Https的包&#xff0c;应用会默认不信任用户安装的证书(手机里自己安装的证书)&#xff0c;只信任系统…

最新版FaceFusion3.0.0,最强AI换脸,表情修改,视频换脸,年龄修改,多人换脸,面部遮挡换脸,参数调优

主要修改&#xff1a;表情修改,视频换脸,年龄修改,多人换脸,面部遮挡换脸,参数调优 变更日志 改造一切皆工作的建筑介绍pixel boost换脸者为面部检测器添加多角度处理引入年龄修正处理器推出 Live Portrait 表情恢复处理器推出由 Live Portrait 提供支持的脸部编辑处理器用res…

视频制作软件哪个好?前十名推荐!

在视频制作领域&#xff0c;选择合适的软件是提升创作效率和作品质量的关键。本文将根据软件的适用人群&#xff1a;新手入门和专业领域&#xff0c;以及推荐的书籍&#xff0c;为您详细介绍视频制作软件的前十名。 新手入门级别&#xff1a; 1.影忆 功能特点&#xff1a;新手入…

浙大数据结构:05-树9 Huffman Codes

这道题难度挺大&#xff0c;写起来较为费劲&#xff0c;这里我依然使用了STL库&#xff0c;使得代码量大幅减少不过百行&#xff0c;便于大家理解。 机翻&#xff1a; 1、条件准备 数组存储字符对应频率&#xff0c;n,student存储输入多少字符&#xff0c;有多少学生测试。 …

【Transformers基础入门篇2】基础组件之Pipeline

文章目录 一、什么是Pipeline二、查看PipeLine支持的任务类型三、Pipeline的创建和使用3.1 根据任务类型&#xff0c;直接创建Pipeline&#xff0c;默认是英文模型3.2 指定任务类型&#xff0c;再指定模型&#xff0c;创建基于指定模型的Pipeline3.3 预先加载模型&#xff0c;再…

用二维码收集信息时,在后台可以查看、统计哪些数据?

大家都知道&#xff0c;在二维码上关联表单&#xff0c;就可以扫码填写信息了。那么&#xff0c;收集到的数据在哪里查看&#xff1f;具体可以查看到哪些数据呢&#xff1f; 如果是用草料二维码平台搭建的二维码&#xff0c;前往后台&#xff0c;在表单列表中找到对应的表单&a…

智能Ai语音机器人的应用价值有哪些?

随着时间的推移&#xff0c;人工智能的发展越来越成熟&#xff0c;智能时代也离人们越来越近&#xff0c;近几年人工智能越来越火爆&#xff0c;人工智能的应用已经开始渗透到各行各业&#xff0c;与生活交融&#xff0c;成为人们无法拒绝&#xff0c;无法失去的一个重要存在。…

【解密 Kotlin 扩展函数】命名参数和默认值(十三)

导读大纲 1.0.1 命名参数1.0.2 默认参数值 上一节讲述如何自定义 joinToString 函数来代替集合的默认字符串表示 文末遗留下几个待优化问题–传送门 1.0.1 命名参数 我们要解决的第一个问题涉及函数调用的可读性 例如,请看下面的joinToString调用: joinToString(collection,&…

MyBatis深度剖析:从入门到精通的实践指南

前言 什么是mybatis&#xff1f; MyBatis是一款优秀的持久层框架&#xff0c;用于简化Java应用程序与数据库之间的交互 什么是框架&#xff0c;为什么需要框架技术&#xff1f; 框架技术 是一个应用程序的半成品提供可重用的公共结构按一定规则组织的一组组件框架优势&#x…

【自动化测试】Appium 生态工具以及Appium Desktop如何安装和使用

引言 Appium 是一个开源的自动化测试框架&#xff0c;用于测试原生、移动 Web 和混合应用程序。它支持 iOS、Android 和 Windows 平台。Appium 生态系统包含多个工具和库&#xff0c;这些工具和库可以与 Appium 一起使用&#xff0c;以提高移动应用的自动化测试效率 文章目录 引…

Java面试指南(基础篇)

文章目录 前言01 Java语言的特点02 JVM、JRE及JDK的关系03 Java和C的区别04 基本数据类型05 类型转换06 自动装箱与拆箱07 String的不可变性08 字符常量和字符串常量的区别09 字符串常量池10 String 类的常用方法11 String和StringBuffer、StringBuilder的区别12 switch 是否能…

舒服了!学大模型必看的学习书籍来了

最近整理了日前市面上一大波大模型的书&#xff0c;已经打包成pdf了&#xff0c;大家有需要的&#xff0c;可以自行添加获取&#xff0c;纯福利&#xff0c;无套路&#xff0c;添加后说明是哪本书&#xff0c;会直接给大家&#xff01;&#xff08;文末获取&#xff09; 部分书…

IO 多路转接之 epoll

文章目录 IO 多路转接之 epoll1、IO 多路转接之 poll1.1、poll 函数1.2、poll 函数返回值1.3、Socket 就绪条件1.3.1、读就绪1.3.2、写就绪1.3.3、异常就绪 1.4、poll 的优点1.5、poll 的缺点1.6、poll 改写 select 2、IO 多路转接之 epoll2.1、epoll 函数2.2、epoll_create2.3…

Leetcode 反转链表

使用递归 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class S…

超低排放燃气锅炉

在全球环保浪潮的推动下&#xff0c;超低排放燃气锅炉以其卓越的环保性能和高效能源利用&#xff0c;正逐渐成为现代热能供应的主力军。作为传统锅炉的升级版&#xff0c;超低排放燃气锅炉不仅在技术上实现了质的飞跃&#xff0c;更在环保和节能方面树立了新的标杆。朗观视觉小…

linux入门到实操-10 控制台显示和输出重定向、监控文件变化、软连接

教程来源&#xff1a;B站视频BV1WY4y1H7d3 3天搞定Linux&#xff0c;1天搞定Shell&#xff0c;清华学神带你通关_哔哩哔哩_bilibili 整理汇总的课程内容笔记和课程资料&#xff08;包含课程同版本linux系统文件等内容&#xff09;&#xff0c;供大家学习交流下载&#xff1a;…

【Delphi】扩展现有组件创建新的 FireMonkey 组件(步骤一)

本例中演示将TLabel控件扩展成TClockLabel新控件。具体如下&#xff1a; 步骤 1 - 使用新建组件向导创建组件 1. 菜单选择 Component -> New Component。 2. 在新建组件向导的第一页&#xff0c;选择 FireMonkey for Delphi &#xff1a; 3. 在 “Ancestor Component ”页…