《算法通关村—原来如此简单》

news2024/11/25 3:09:12

《算法通关村—原来如此简单》

理解层序遍历

我们有一个二叉树,我们如何去进行一层一层的遍历呢?

需要我们借用一个数据结构来进行遍历,数据结构就是队列。我们首先把根节点放入队列中,然后从此进行遍历。如何进行遍历?用一个while循环来进行遍历,什么时候队列中为空了什么时候遍历就结束了。

看一下关键代码,我们再接着往下讲:

class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    public static void bianli(TreeNode root){
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i=00;i<size;i++){
                TreeNode temp = queue.remove();
                if(temp.left != null){
                    queue.offer(temp.left);
                }
                if(temp.right != null){
                    queue.offer(temp.right);
                }
            }
        }
    }
}

在一个while循环我们,我们先得到队列此时的大小,其实此时的大小就是这一层的元素个数,我们需要对他们纷纷进行处理,然后把下一层存在的元素加入到队列的尾巴。中间的for循环就是处理一层的元素,for循环 的if就是下一层的元素加入到队列中。

通过这样子的一个流程我们就实现层序遍历。

做题理解

LeetCode102

题目要求:给你一个二叉树,请你返回其按层序遍历得到的节点值。(即逐层地,从左到右访问所有节点)。

示例1:

在这里插入图片描述

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

输入:root = [1]
输出:[[1]]
示例 3:

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

解题:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 import java.util.LinkedList;
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        if(root == null){
            return new ArrayList<List<Integer>>();
        }
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        TreeNode t = root;
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.add(t);
        while(queue.size()> 0){
            int size = queue.size();
            List<Integer> tmp = new ArrayList<Integer>();
            for(int i = 0 ; i< size;i++){
                TreeNode temp = queue.remove();
                                tmp.add(temp.val);
                if(temp.left != null){
                    queue.add(temp.left);
                }
                if(temp.right!=null){
                    queue.add(temp.right);
                }
            }
            res.add(tmp);
        }
        return res;
    }
}

二叉树的层序遍历 II

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例1:

在这里插入图片描述

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

输入:root = [1]
输出:[[1]]
示例 3:

输入:root = []
输出:[]
 
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new LinkedList<List<Integer>>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        if(root == null){
            return new LinkedList<List<Integer>>();
        }
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> temp = new ArrayList<Integer>();
            for(int i = 0 ;i<size;i++){
                TreeNode t = queue.poll();
                temp.add(t.val);
                if(t.left !=null){
                    queue.offer(t.left);
                }
                if(t.right != null){
                    queue.offer(t.right);
                }
            }
            res.add(0,temp);
        }
        return res;
    }
}

二叉树的锯齿形层序遍历

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)

在这里插入图片描述

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

输入:root = [1]
输出:[[1]]
示例 3:

输入:root = []
输出:[]
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> res = new LinkedList<List<Integer>>();
        if(root == null){
            return new LinkedList<List<Integer>>();
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        Boolean isleft = true;
        while(!queue.isEmpty()){
            Deque<Integer> temp = new LinkedList<Integer>();
            int size = queue.size();
            for(int i = 0 ; i< size;i++){
                TreeNode t = queue.remove();
                if(isleft){
                    temp.offerLast(t.val);
                }else{
                    temp.offerFirst(t.val);
                }
                if(t.left != null){
                    queue.offer(t.left);
                }
                if(t.right != null){
                    queue.offer(t.right);
                }
            }
            res.add(new LinkedList<Integer>(temp));
            isleft = !isleft;
        }
        return res;
    }
}

429,515,637都是类似的题目哦,一点简单的变化就好了。

找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

示例1:

在这里插入图片描述

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

示例2:

在这里插入图片描述

输入: [1,2,3,4,null,5,6,null,null,7]
输出: 7

一个想法就是进行反转然后到了最后那么队列中最后的一个元素就是我们要找的了。

不好理解我们画一个图理解一下;

在这个二叉树中,我们要找的就是2

在这里插入图片描述

要找到最后一层的最左边的元素只需要我们反转,就是每次让节点进入
队列的时候都先让右边的进入,然后最后一个节点就是我们要找的节点。
在这里插入图片描述

代码解决:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int findBottomLeftValue(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        TreeNode temp = new TreeNode();
        while(!queue.isEmpty()){
            temp =queue.poll();
            if(temp.right!= null){
                queue.offer(temp.right);
            }
            if(temp.left!=null){
                queue.offer(temp.left);
            }
        }
        return temp.val;
    }
}

点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

也可以加我QQ(2837468248)咨询说明来意!

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

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

相关文章

SpringBoot项目从resources目录读取文件

SpringBoot 从 resources 读取文件 使用 Spring 给我们提供的工具类来进行读取 File file org.springframework.util.ResourceUtils.getFile("classpath:人物模板.docx");可能读取失败&#xff0c;出现如下错误&#xff1a; java.io.FileNotFoundException: clas…

JSP 中医知识管理系统myeclipse开发sql数据库BS模式java编程网页结构

一、源码特点 JSP 中医知识管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;比较流行的ssh框架系统具有完整的源代码和数据库&#xff0c;myeclipse开发系统主要采用B/S模式开发。 javaWeb中医知识系统 二、功能介绍 此次系统主要…

电脑提示由于找不到msvcp120.dll无法继续执行代码的问题如何解决

在打开软件过程中&#xff0c;我们可能会遇到各种错误和问题。其中之一就是msvcp120.dll无法继续执行代码的问题。这个问题通常是由于缺少或损坏的Microsoft Visual C Redistributable Packages导致的。为了解决这个问题&#xff0c;我们可以采取以下四个解决方案&#xff1a; …

【逗老师的无线电】BI1FQO教你整骚活,纯4G MMDVM热点版

开篇图&#xff0c;看我手搓出来的尺寸超小的MMDVM热点盒子&#xff08;都不能叫做盒子啦&#xff09; 咱就说这玩意尺寸有多小&#xff0c;架构有多简单&#xff0c;4G网卡直连双工热点版&#xff0c;省去树莓派或者OpenWrt&#xff0c;功耗低至0.几W。开机秒快。 基本原…

大数据管理平台是什么?如何利用工单系统提升企业管理效率?

随着数字化时代的来临&#xff0c;大数据管理平台已成为企业优化运营、提高竞争力的关键工具。工单管理系统作为大数据管理平台的核心组件&#xff0c;对于企业服务的优化和提升发挥着至关重要的作用。本文小编将为您揭示工单管理系统在大数据管理平台中的重要地位&#xff0c;…

libpcap之数据分流

当前系统都是多核系统&#xff0c;为了充分利用多核优势&#xff0c;数据包可以在底层就进行分流&#xff0c;可以通过多线程/多进程对同一个接口的数据进行并行的处理。 一、实验 一个server/client程序一个简单的抓包程序&#xff0c;抓取server/client之间的通信数据 1.1 …

Bat批量处理

一&#xff1a;创建文件夹 excel创建文件 复制出来新建文本文件 另存为bat 双击bat 二&#xff1a;批量移动文件 A列&#xff1a;获取的文件名列表 dir /b/o:n> original.txt B列&#xff1a;填充序号 C列公式&#xff1a;每隔9行增加1 INT((ROW(B1)-1)/9)1 D列公式&am…

CDN与WAF防火墙:强强联手,守护您的网站安全

随着互联网的普及&#xff0c;网站安全问题变得愈发重要。恶意攻击、数据泄露和服务中断等问题都可能给网站和用户带来严重损害。在保护网站免受这些威胁的过程中&#xff0c;内容分发网络&#xff08;CDN&#xff09;和Web应用程序防火墙&#xff08;WAF&#xff09;是两个强大…

C++算法 —— 贪心(2)

文章目录 1、柠檬水找零2、将数组和减半的最少操作次数3、最大数4、摆动序列5、最长递增子序列6、递增的三元子序列7、最长连续递增子序列 1、柠檬水找零 860. 柠檬水找零 如果一开始顾客给了10块&#xff0c;那就直接结束。给了5块那就收下。之后每一个位置&#xff0c;都需要…

进阶C语言-指针的进阶(三)

模拟实现qsort函数 &#x1f388;1.测试bubble_sort&#xff0c;排序整型数组&#x1f388;2测试bubble_sort&#xff0c;排序结构体数组 &#x1f4dd;关于qsort函数&#xff0c;我们可以先去cpluplus网站上面了解一下&#xff1a; //1.排序整型数组&#xff0c;两个整型可以…

Linux 上的轻量级浏览器

导读大多数 Linux 桌面环境中包含的基本图像查看器可能不足以满足你的需要。如果你想要一些更多的功能&#xff0c;但仍然希望它是轻量级的&#xff0c;那么看看这四个 Linux 桌面中的图像查看器&#xff0c;如果还不能满足你的需要&#xff0c;还有额外的选择。 当你需要的不…

竞赛选题 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

整理的一些Java细节问题

1. 为什么要有无参构造&#xff1f; 在 Java 中&#xff0c;如果一个类没有显式定义构造方法&#xff0c;编译器会自动生成一个默认的无参构造方法&#xff08;也称为默认构造方法&#xff09;。无参构造方法是一个没有任何参数的构造方法。 无参构造方法的存在有几个重要原因…

【vscode输出中文乱码】

vscode输出中文乱码为一个个的问号。 这个链接亲测有用 win11对应的界面在这里&#xff1a;

产品经理入门学习(二):产品经理问题思考维度

参考引用 黑马-产品经理入门基础课程 1. 抓住核心用户 1.1 为什么要抓住核心用户 什么是用户&#xff1f; 所有和产品有关系的群体就是用户&#xff0c;他们是一群既有共性&#xff0c;又有差异的群体组合 做产品为什么要了解用户&#xff1f; 了解用户的付费点、更好的优化产…

文件同步工具推荐:挑选高效实用的工具大揭秘

随着工作的累积&#xff0c;会持续产出大量电子资料和文件。如何妥善管理这些文件资料&#xff0c;成了一个问题。有需求就有市场&#xff0c;当下市场上也有很多文件同步工具。 有什么好用的文件同步工具&#xff1f; Zoho WorkDrive 同步网盘就是一款好用的文件同步工具&am…

Leetcode—199.二叉树的右视图【中等】

2023每日刷题&#xff08;十九&#xff09; Leetcode—199.二叉树的右视图 深度优先遍历实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(…

【数据结构】冒泡排序

冒泡排序 前言冒泡排序运行图例算法实现基本思路算法实现步骤算法码源详解冒泡排序效率分析&#xff08;一&#xff09;时间复杂度——O&#xff08;N^2&#xff09;&#xff08;二&#xff09;空间复杂度——O&#xff08;1&#xff09;&#xff08;三&#xff09;稳定性&…

人工智能基础_机器学习018_手写代码实现_MBGD小批量梯度下降---人工智能工作笔记0058

然后我们继续来看这里的小批量梯度下降,小批量梯度下降,其实就是 用少量的样本数据,进行梯度下降,上面是公式 然后我们来看代码 import numpy as np 导入数学计算包 #X,y创建数据集X=np.random.rand(100,1) x是100行1列 w,b=np.random.randint(1,10,size=2) 然后获取w和截距…

干货分享:10个行业可视化大屏模板(附 Python 源码)

大家好&#xff0c;数据大屏是一种用于展示和分析数据的可视化工具&#xff0c;通常用于监控、分析和报告数据。大屏可以帮助组织更好地理解和管理其数据&#xff0c;支持数据驱动决策&#xff0c;提高业务效率和决策的质量。 本文的所有大屏都是基于Python开发&#xff0c;因…