【数据结构与算法 | 二叉树篇】力扣101, 104, 111,LCR144

news2024/11/27 22:28:40

1. 力扣101 : 对称二叉树

(1). 题

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

示例 1:

 

2dc5ea809ff0eb36fd156f37788fdcdb.png

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

示例 2:

 

d33f9d5852eb761351550728f8eb77e5.png

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

提示:

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

(2). 思路

用队列将二叉树的根节点的左子树和右子树的值记录下来,然后while循环比较.

(3). 解

class Solution {
    Deque<Integer> deque1 = new LinkedList<>();
    Deque<Integer> deque2 = new LinkedList<>();
    public boolean isSymmetric(TreeNode root) {
        boolean flag = true;
        recursionLeft(root.left);
        recursionRight(root.right);
        while (!deque1.isEmpty() && !deque2.isEmpty()) {
            if (deque1.poll() != deque2.poll()) {
                flag = false;
            }
        }
        return flag;
    }
    public void recursionLeft(TreeNode root) {
        if (root == null) {
            deque1.offer(110);
            return;
        }
        deque1.offer(root.val);
        recursionLeft(root.left);
        recursionLeft(root.right);
    }

    public void recursionRight(TreeNode root) {
        if (root == null) {
            //这处代码是需要的, 不然光靠根左右是无法确定是否是对称的
            deque2.offer(110);
            return;
        }
        deque2.offer(root.val);
        recursionRight(root.right);
        recursionRight(root.left);
    }
}

(4). 思路2

使用递归判断.

(5). 解2

class Solution {
    //递归
    public boolean isSymmetric(TreeNode root) {
        return recursion(root.left, root.right);
    }
    private boolean recursion(TreeNode left, TreeNode right){
        //如果需要比较的节点都为null, 返回true
        if (left == null && right == null) {
            return true;
        }
        //这种情况显然是false, 但为了保证第三个if判断不出现空指针异常, 所以单独提前判断
        if (left == null && right != null || left != null && right == null) {
            return false;
        } 
        //此时left, right节点都不为空, 所以比较二者的值
        if (left.val == right.val){
            //并继续比较两节点的孩子的值是否相等
            return recursion(left.left, right.right) && recursion(left.right, right.left);
        } else {
            return false;
        }
    }
}

2. 力扣104 : 二叉树的最大深度

(1). 题

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

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

示例 1:

 

57d86be0ace5249a1ff523aed8394f0d.jpeg

 

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

示例 2:

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

提示:

  • 树中节点的数量在 [0, 104] 区间内。
  • -100 <= Node.val <= 100

(2). 思路

递归,从根节点开始,树的最大高度就是,根节点+左孩子的高度/右孩子的高度.而该左孩子的高度为左孩子+左孩子的左孩子的高度/左孩子的右孩子高度...

(3). 解

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int a = maxDepth(root.left);
        int b = maxDepth(root.right);
        a = a > b ? a : b;
        return 1 + a;
    }
}

(4). 思路2

后序遍历+栈最大长度.

(5). 解2

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //后序遍历 + 栈的最大深度
        TreeNode cur = root;
        Deque<TreeNode> deque = new LinkedList<>();
        int depth = 0;
        TreeNode pop = null;
        while (cur != null || !deque.isEmpty()){
            if (cur != null) {
                deque.push(cur);
                depth = depth > deque.size() ? depth : deque.size();
                cur = cur.left;
            } else {
                TreeNode peek = deque.peek();
                if (peek.right == null || peek.right == pop){
                    pop = deque.pop();
                } else {
                    cur = peek.right;
                }
            }
        }
        return depth;
    }
}

(6). 思路3

队列+层序遍历,返回层数.

(7). 解3

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        //层序遍历
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int size = 1;
        int n = 0;
        int height = 0;
        TreeNode p;
        //只要队列不为空
        while (!queue.isEmpty()){
            for (int i = 0; i < size; i++) {
                p = queue.poll();
                if (p.left != null) {
                    queue.offer(p.left);
                    n++;
                }
                if (p.right != null) {
                    queue.offer(p.right);
                    n++;
                }
            }
            size = n;
            n = 0;
            height++;
        }
        return height;
    }
}

3. 力扣111 : 二叉树的最小深度

(1). 题

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

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

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

示例 1:

 

073ebecd81858f8b9d06f38fb2b5b888.jpeg

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

示例 2:

输入:root = [2,null,3,null,4,null,5,null,6]
输出:5

提示:

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

(2). 思路

与求解二叉树的最大二叉树代码不同的是,题目要求根节点到最近叶子节点的高度,对于根节点只有左子树(或只有右子树)这种情况来说,需要额外讨论,因为此时不能直接返回1,而是要返回1+右子树的高度.

(3). 解

class Solution {
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        if (root.left == null) {
            return 1 + minDepth(root.right);
        }
        if (root.right == null) {
            return 1 + minDepth(root.left);
        }
        int a = minDepth(root.left);
        int b = minDepth(root.right);
        a = a < b ? a : b;
        return a + 1;
    }
}

4. LCR144 : 翻转二叉树

(1). 题

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

示例 1:

 

b6a7ff05b657f08121b4da73b2c5330f.png

输入:root = [5,7,9,8,3,2,4]
输出:[5,9,7,4,2,3,8]

提示:

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

(2). 思路1

迭代思路,该题的关键就是注意到,翻转二叉树,其实就是翻转二叉树的每一个非叶子节点. 队列数据结构,存储需要翻转的非叶子节点.

(3). 解1

class Solution {
    public TreeNode mirrorTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        recursion(root);
        return root;
    }
    private void recursion(TreeNode root) {
        Deque<TreeNode> deque = new LinkedList<>();
        deque.offer(root);
        TreeNode p;
        TreeNode a;
        TreeNode b;
        while (!deque.isEmpty()){
            p = deque.poll();
            if (p.left == null && p.right == null) {
                continue;
            }
            if (p.left != null) {
                deque.offer(p.left);
            }
            if (p.right != null) {
                deque.offer(p.right);
            }
            a = p.left;
            b = p.right;
            p.left = b;
            p.right = a;
        }
    }
    
}

(4). 思路2

递归,思路与迭代一致.

(5). 解2

class Solution {
    public TreeNode mirrorTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        recursion(root);
        return root;
    }
    private void recursion(TreeNode root) {
        if (root == null){
            return;
        }
        TreeNode p = root.left;
        TreeNode q = root.right;
        root.left = q;
        root.right = p;
        recursion(root.left);
        recursion(root.right);
    }
    
}

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

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

相关文章

Go语言 几种常见的IO模型用法 和 netpoll与原生GoNet对比

【go基础】16.I/O模型与网络轮询器netpoller_go中的多路io复用模型-CSDN博客 字节开源的netPoll多路复用器源码解析-CSDN博客 一、几种常见的IO模型 1. 阻塞I/O (1) 解释&#xff1a; 用户调用如accept、read等系统调用&#xff0c;向内核发起I/O请求后&#xff0c;应用程序…

多样本上下文学习:开拓大模型的新领域

大模型&#xff08;LLMs&#xff09;在少量样本上下文学习&#xff08;ICL&#xff09;中展现出了卓越的能力&#xff0c;即通过在推理过程中提供少量输入输出示例来学习&#xff0c;而无需更新权重。随着上下文窗口的扩展&#xff0c;我们现在可以探索包含数百甚至数千个示例的…

基于JSP技术的文物管理系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员界面 用户前台…

步态控制之ZMP

零力矩点&#xff08;Zero Moment Point&#xff0c;ZMP&#xff09;概述 ZMP步态控制是人形机器人步态控制中的一个关键概念&#xff0c;旨在确保机器人在行走或站立过程中保持平衡。ZMP是指机器人接触面上力矩为零的点&#xff0c;确保在该点上机器人不会倾倒。这个示例展示…

Python的登录注册界面跳转汽车主页面

1.登录注册界面的代码&#xff1a; import tkinter as tk from tkinter import messagebox,ttk from tkinter import simpledialog from ui.car_ui import start_car_ui# 设置主题风格 style ttk.Style() style.theme_use("default") # 可以根据需要选择不同的主题…

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址&#xff1a;竞拍商城系统源码后端PHP前端UNIAPP

Live800:深度解析,客户服务如何塑造品牌形象

在当今竞争激烈的市场环境中&#xff0c;品牌形象对于企业的成功至关重要。而客户服务作为品牌与消费者之间最直接的互动方式&#xff0c;不仅影响着消费者的购买决策&#xff0c;更在塑造品牌形象方面发挥着不可替代的作用。本文将深度解析客户服务如何塑造品牌形象&#xff0…

1074 宇宙无敌加法器(测试点5)

solution 每位权值不同的高精度加法测试点5&#xff1a;结果为0的情况 #include<iostream> #include<string> using namespace std; int main(){string rule, a, b, ans "";int carry 0, temp, cnt, power;cin >> rule >> a >> b;…

【Python】FastAPI返回不带双引号的字符串

昨天为获取代理ip写的一个接口&#xff0c;但返回的数据是带有双引号&#xff0c;终究不适合一些应用场景&#xff0c;带引号的是这样的&#xff1a; 说实在话&#xff0c;一时我也愣住了&#xff0c;竟然不知道要咋去掉这个双引号。因为是api接口&#xff0c;直接显示结果&…

HW面试常见知识点2——研判分析(蓝队中级版)

&#x1f340;文章简介&#xff1a;又到了一年一度的HW时刻&#xff0c;本文写给新手想快速进阶HW蓝中的网安爱好者们&#xff0c; 通读熟练掌握本文面试定个蓝中还是没问题的&#xff01;大家也要灵活随机应变&#xff0c;不要太刻板的回答&#xff09; &#x1f341;个人主页…

计算机网络 期末复习(谢希仁版本)第8章

元文件就是一种非常小的文件&#xff0c;它描述或指明其他文件的一些重要信息。这里的元文件保存了有关这个音频/视频文件的信息。 10. 流式&#xff1a;TCP&#xff1b;流式实况&#xff1a;UDP。

零基础入门学用Arduino 第二部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

在windows下使用本地AI模型提供翻译、对话、文生图服务

文章目录 在windows下使用本地AI模型提供翻译、对话、文生图服务ollama简介下载安装配置环境变量模型安装目录服务监听地址跨域配置我的配置注意事项 开机自启 使用运行模型对话时的命令 查看本地已安装模型删除模型 查看ollama支持的模型 Docker Desktop简介下载安装配置开机自…

Linux驱动应用编程(四)IIC(获取BMP180温度/压力数据)

本文目录 一、基础1. 查看开发板手册&#xff0c;获取可用IIC总线2. 挂载从机&#xff0c;查看从机地址。3. 查看BMP180手册&#xff0c;使用命令读/写某寄存器值。4. 查看BMP180手册通信流程。 二、IIC常用API1. iic数据包/报2. ioctl函数 三、数据包如何被处理四、代码编写流…

(2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干

Vision-LSTM: xLSTM as Generic Vision Backbone 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2 方法 3 实验 3.1 分类设计 4 结论 0. 摘要 Transformer 被广泛用作计算…

FM148R,FM147A和利时卡件

FM148R,FM147A和利时卡件。软件组成及各部分功能软件组成---各组件功能注意事项&#xff1a;仿真功能&#xff1a;仿真系统可以用于在单机上对组态完成的工程内容进行模拟运行。FM148R,FM147A和利时卡件。便于对这些组态内容的正确性和合理性进行初步调试。二、FM148R,FM147A和…

【Vue】面经基础版-案例效果分析

面经效果演示 功能分析 通过演示效果发现&#xff0c;主要的功能页面有两个&#xff0c;一个是列表页&#xff0c;一个是详情页&#xff0c;并且在列表页点击时可以跳转到详情页底部导航可以来回切换&#xff0c;并且切换时&#xff0c;只有上面的主题内容在动态渲染 实现思路…

C++基础四:C++模板编程

目录 一:函数模板 二:类模板 空间配置器allocator 一:函数模板 模板代码只能同一实现,不能先声明,再在另一文件实现,模板代码都是放在头文件当中的,在头文件中直接实现 二:类模板 template<typename T=int> class SeqStack // 模板名称+类型参数列表 = 类名称…

8.3 Go 包的组织结构

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

list模拟与实现(附源码)

文章目录 声明list的简单介绍list的简单使用list中sort效率测试list的简单模拟封装迭代器insert模拟erase模拟头插、尾插、头删、尾删模拟自定义类型迭代器遍历const迭代器clear和析构函数拷贝构造&#xff08;传统写法&#xff09;拷贝构造&#xff08;现代写法&#xff09; 源…