代码学习记录13

news2024/11/23 23:24:10

随想录日记part13

t i m e : time: time 2024.03.06



主要内容:今天的主要内容是二叉树的第二部分哦,主要有层序遍历;翻转二叉树;对称二叉树。

  • 102.二叉树的层序遍历
  • 226.翻转二叉树
  • 101. 对称二叉树


Topic1二叉树的层序遍历

题目: 给你二叉树的根节点 r o o t root root ,返回其节点值的层序遍历。 (即逐层地,从左到右访问所有节点)。

示例:
请添加图片描述
输入: r o o t = [ 3 , 9 , 20 , n u l l , n u l l , 15 , 7 ] root = [3,9,20,null,null,15,7] root=[3,9,20,null,null,15,7]
输出: [ [ 3 ] , [ 9 , 20 ] , [ 15 , 7 ] ] [[3],[9,20],[15,7]] [[3],[9,20],[15,7]]

**思路:**层序遍历是一层一层去遍历二叉树,符合先进先出的规则,即图论中的广度优先遍历思路,所以这道题目我们需要辅助的队列来实现层序遍历。其遍历的动画可以观看下面的动画:
请添加图片描述
下面给出两种层序遍历的写法:

class Solution {
    // 定义一个记录组后输出的数组
    public List<List<Integer>> resList = new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        //levelOrder_queue(root);
        levelOrder_queue_pro(root,0);
        return resList;
    }

    // 使用栈辅助进行层次遍历
    private void levelOrder_queue(TreeNode root) {
        if (root == null)
            return;
        // 创建辅助队列
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(root);
        while (!q.isEmpty()) {
            List<Integer> tem = new ArrayList<Integer>();
            int length = q.size();
            while (length > 0) {
                TreeNode t = q.poll();
                tem.add(t.val);
                if (t.left != null)
                    q.offer(t.left);
                if (t.right != null)
                    q.offer(t.right);
                length--;
            }
            resList.add(tem);
        }
    }

    //使用递归的方法
    private void levelOrder_queue_pro(TreeNode root,int deep){
        if(root==null) return;
        deep++;
        if(resList.size()<deep){
            //当层级增加时,list的Item也增加,利用list的索引值进行层级界定
            List<Integer> tem = new ArrayList<Integer>();
            resList.add(tem);
        }
        resList.get(deep-1).add(root.val);
        levelOrder_queue_pro(root.left,deep);
        levelOrder_queue_pro(root.right,deep);

    }
}

上面的两种写法务必要记住。



Topic2翻转二叉树

**题目:**给你一棵二叉树的根节点 r o o t root root ,翻转这棵二叉树,并返回其根节点。
示例:请添加图片描述
输入: r o o t = [ 4 , 2 , 7 , 1 , 3 , 6 , 9 ] root = [4,2,7,1,3,6,9] root=[4,2,7,1,3,6,9]
输出: [ 4 , 7 , 2 , 9 , 6 , 3 , 1 ] [4,7,2,9,6,3,1] [4,7,2,9,6,3,1]

**思路:**整个树的翻转主要有两种思路:

  • 递归
  • 迭代
  • 递归法:写好递归是要有三个关键点注意的:
    1.确定参数和返回值
TreeNode transTree(TreeNode root);

2.确定中止条件

 if(root==null)return null;

3.确定单层递归逻辑
我的代码是前序遍历,先反转左右子树,然后进行交换左右孩子节点

		TreeNode b=transTree(root.right);
        TreeNode a=transTree(root.left);
        tem.left=b;
        tem.right=a;

完整的 j a v a java java 代码如下:

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

    private TreeNode transTree(TreeNode root) {
        TreeNode tem = root;
        if (tem == null)
            return null;
        TreeNode b = transTree(root.right);
        TreeNode a = transTree(root.left);
        tem.left = b;
        tem.right = a;
        return root;
    }
}

  • 迭代法:能够使用递归的方法都能使用栈来实现:
    如下面代码实现:
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null)return root;
        //建立栈
        Stack<TreeNode> stack=new Stack<TreeNode>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tem=stack.pop();
            transpoint(tem);
            if(tem.right!=null)stack.push(tem.right);
            if(tem.left!=null)stack.push(tem.left);
        }
        return root;
    }

    private void transpoint(TreeNode root){
        if(root==null)return;
        else{
            TreeNode t=root.left;
            root.left=root.right;
            root.right=t;
        }
    }
}


Topic3对称二叉树

**题目:**给你一个二叉树的根节点 r o o t root root , 检查它是否轴对称。
示例:
请添加图片描述
输入: r o o t = [ 1 , 2 , 2 , 3 , 4 , 4 , 3 ] root = [1,2,2,3,4,4,3] root=[1,2,2,3,4,4,3]
输出: t r u e true true

思路:
后序遍历的递归法以及迭代法

递归法:

class Solution {// 递归法
    public boolean isSymmetric(TreeNode root) {
        if (root == null)
            return true;
        else
            return isSame(root.left, root.right);
    }

    private boolean isSame(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 {
            boolean a = isSame(left.left, right.right);
            boolean b = isSame(left.right, right.left);
            return (a && b);
        }
    }
}

迭代法:
请添加图片描述
代码实现如下:

class Solution {// 使用队列辅助实现的迭代法
    public boolean isSymmetric(TreeNode root) {
        if (root == null)
            return true;
        Deque<TreeNode> queue = new LinkedList<>();
        queue.offerFirst(root.left);// 将左子树头节点压入
        queue.offerLast(root.right);// 将右子树头节点压入
        while (!queue.isEmpty()) {
            TreeNode left = queue.pollFirst();
            TreeNode right = queue.pollLast();
            if (left == null && right == null)
                continue;
            if (left == null || right == null || left.val != right.val)
                return false;
            queue.offerFirst(left.left);
            queue.offerLast(right.right);
            queue.offerFirst(left.right);
            queue.offerLast(right.left);
        }
        return true;
    }
}

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

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

相关文章

Java精品项目--第6期基于SpringBoot的茶叶商城的设计分析与实现

项目技术栈 SpringBootMavenMySQLJAVAMybatis-PLusVue.js&#xff08;非前后端分离&#xff09;Element-UI&#xff08;非前后端分离&#xff09;… 表截图 项目截图

分布式事务(SeataClient)

问题场景 元数据 库存 100订单记录为空下单操作 @AutowiredRestTemplate restTemplate;/*** 下单** @return*/@Transactional // 开启事务 异常后触发数据库回滚操作@Overridepublic Order create(Order order) {// 插入订单orderMapper.insert(order);// 扣减库存 MultiValu…

Python调用edge-tts实现在线文字转语音

edge-tts是一个 Python 模块&#xff0c;允许通过Python代码或命令的方式使用 Microsoft Edge 的在线文本转语音服务。 项目源码 GitHub - rany2/edge-tts: Use Microsoft Edges online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an…

Intel RealSense D435环境搭建之安装pyrealsense2

ERROR: Could not find a version that satisfies the requirement pyrealsense2 (from versions: none) pip install pyrealsense2 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 方法一&#xff1a;升级pip python -m pip install --upgrade pip 方…

Scrapy与分布式开发(3):Scrapy核心组件与运行机制

Scrapy核心组件与运行机制 引言 这一章开始讲解Scrapy核心组件的功能与作用&#xff0c;通过流程图了解整体的运行机制&#xff0c;然后了解它的安装与项目创建&#xff0c;为后续实战做好准备。 Scrapy定义 Scrapy是一个为了爬取网站数据、提取结构性数据而编写的应用框架…

java-新手笔记(类篇)-暂时总结

类定义 用于存储的方法的结构体容器,可以封装多个方法 当在ideal编程器中的工程中创建类文件的同时,就会创建一个公共类, 当我们在新建一个公共类的时候,会出现报错,其要求公共类必须同类文件名一致 同一文件编写新类的时候,不要加public修饰词 调用类…

基于串流技术的p2p共享桌面共享方案

研究远控有一定时间了&#xff0c;但真正落地运用的不多&#xff0c;所以也不太上心&#xff0c;平时也只是自己diy玩玩&#xff0c;远程共享看看电视剧。 最近生成式ai大火&#xff0c;直接带动了gpu应用的相关场景&#xff0c;相关场景&#xff0c;但gpu卡又贵&#xff0c;对…

EXCEL计算时间差(单位毫秒)

公式 VALUE(MID(TEXT(C4,"h:mm:ss.000"),10,7))VALUE(MID(TEXT(C4,"h:mm:ss.000"),6,4))*1000

八、西瓜书——特征选择与稀疏学习

1.子集搜索与评价 对于1个学习任务来说,给定属性集,其中有些属性可能很关键、很有用&#xff0c;另一些属性则可能没什么用&#xff0c;我们将属性称为“特征”(feature),对当前学习任务有用的属性称为“相关特征”(relevant feature)、没什么用的属性称为“无关特征”(irrelev…

Xilinx 7系列FPGA配置(ug470)

Xilinx 7系列FPGA配置&#xff08;ug470&#xff09; 配置模式串行配置模式接口从-连接方式主-连接方式串行菊花链&#xff08;非同时配置&#xff09;串行配置&#xff08;同时配置&#xff09;时序 主SPI配置模式SPIx1/x2 连接图SPIx1模式时序SPIx4 连接图SPI操作指令操作fla…

【工作记录】Threejs学习笔记-引入OrbitControls

前言 前一篇文章我们介绍了three.js中的基础概念&#xff0c;并给出了展示整体流程的一个简单示例&#xff0c; 本文我们继续研究。 问题 我们在很多3d效果图上都能看到鼠标移动或者缩进实现旋转或者放大缩小的效果&#xff0c;这个在three.js中是通过OrbitControls这个组件…

计网面试题整理上

1. 计算机网络的各层协议及作用&#xff1f; 计算机网络体系可以大致分为一下三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。 OSI七层模型&#xff1a;大而全&#xff0c;但是比较复杂、而且是先有了理论模型&#xff0c;没有实际应用。TCP/IP四层模型&#xff1a…

应急响应实战笔记03权限维持篇(6)

第6篇&#xff1a;三大渗透测试框架权限维持技术 0x00 前言 在渗透测试中&#xff0c;有三个非常经典的渗透测试框架----Metasploit、Empire、Cobalt Strike。 那么&#xff0c;通过漏洞获取到目标主机权限后&#xff0c;如何利用框架获得持久性权限呢&#xff1f; 0x01 MS…

【递归搜索回溯专栏】专题一递归:快速幂

本专栏内容为&#xff1a;递归&#xff0c;搜索与回溯算法专栏。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;递归搜索回溯专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

折线图 温度变化曲线图

代码详情介绍 导入必要的库&#xff1a; matplotlib.pyplot&#xff1a;用于绘图。 matplotlib.font_manager&#xff1a;用于设置中文字体。 datetime&#xff1a;用于处理日期和时间。 random&#xff1a;用于生成随机数。 numpy&#xff1a;用于生成arange函数的刻度。 设置…

递推与递归DFS

&#xff1b;例题引入&#xff1a; 在跳楼梯问题中&#xff0c;我们假设每次可以跳1级或2级。如果我们想跳到第N级台阶&#xff0c;那么我们的最后一次跳跃只能是1级或2级。 如果我们最后一次跳1级&#xff0c;那么我们必须先跳到第N-1级台阶。由于跳到第N-1级台阶有f(N-1)种方…

【web安全】实战 批量横扫springboot命令执行漏洞

天命&#xff1a;这次目标批量横扫&#xff0c;但是没完全成功&#xff0c;也没完全失败 步骤1&#xff1a;磨刀准备 这次先针对漏洞来寻找目标&#xff0c;所以寻找这种 springboot 的目标 利用CVE漏洞&#xff0c;进行命令执行攻击 先找靶场训练一波&#xff0c;叠加反弹sh…

【Linux】Linux网络故障排查与解决指南

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Linux ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 检查网络连接状态&#xff1a; 检查路由表&#xff1a; 检查DNS配置&#xff1a; 检查网络连接状态&#xff1a; 检查防火墙设…

用python和pygame库实现刮刮乐游戏

用python和pygame库实现刮刮乐游戏 首先&#xff0c;确保你已经安装了pygame库。如果没有安装&#xff0c;可以通过以下命令安装&#xff1a; pip install pygame 示例有两个。 一、简单刮刮乐游戏 准备两张图片&#xff0c;一张作为背景bottom_image.png&#xff0c;一张作…

C++ 链表OJ

目录 1、2. 两数相加 2、24. 两两交换链表中的节点 3、143. 重排链表 4、23. 合并 K 个升序链表 5、25. K 个一组翻转链表 解决链表题目常用方法&#xff1a; 1、画图 2、引入虚拟"头”结点 便于处理边界情况方便我们对链表操作 3、大胆定义变量&#xff0c;减少连接…