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

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

理解层序遍历

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

需要我们借用一个数据结构来进行遍历,数据结构就是队列。我们首先把根节点放入队列中,然后从此进行遍历。如何进行遍历?用一个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.hqwc.cn/news/159874.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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

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

K8S知识点(一)

&#xff08;1&#xff09;应用部署方式转变 &#xff08;2&#xff09;K8S介绍 容器部署容易出现编排问题&#xff0c;为了解决就出现了大量的编排软件&#xff0c;这里将的是K8S编排问题的解决佼佼者 弹性伸缩&#xff1a;当流量从1000变为1200可以&#xff0c;自动开启一个…

【实战Flask API项目指南】之五 RESTful API设计

实战Flask API项目指南之 RESTful API设计 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界时…

EASYX输出文字

在EASYX中绘制出字符串和字符 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #include <stdlib.h> #include <conio.h> #include <time.h> #define PI 3.14、 //…

外卖行业如何借助微信管理系统实现高效运营

摘要&#xff1a;本文将介绍微信管理系统在外卖行业的应用&#xff0c;包括聚合聊天、朋友圈营销和群发功能。通过这些功能&#xff0c;外卖商家可以更高效地管理订单、与客户沟通、推广品牌和增加销售额。 一、引言 随着外卖行业的快速发展&#xff0c;竞争也日益激烈。为了…

使用LIME解释各种机器学习模型代码示例

机器学习模型变得越来越复杂和准确&#xff0c;但它们的不透明性仍然是一个重大挑战。理解为什么一个模型会做出特定的预测&#xff0c;对于建立信任和确保它按照预期行事至关重要。在本文中&#xff0c;我们将介绍LIME&#xff0c;并使用它来解释各种常见的模型。 LIME LIME…

【深度学习基础】Pytorch框架CV开发(2)实战篇

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

云安全-云原生k8s攻击点(8080,6443,10250未授权攻击点)

0x00 k8s简介 k8s&#xff08;Kubernetes&#xff09; 是容器管理平台&#xff0c;用来管理容器化的应用&#xff0c;提供快速的容器调度、弹性伸缩等诸多功能&#xff0c;可以理解为容器云&#xff0c;不涉及到业务层面的开发。只要你的应用可以实现容器化&#xff0c;就可以部…

C++之初始化列表详细剖析

一、初始化列表定义 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式。 class Date { public:Date(int year, int month, int day): _year(year), _month(mont…

STM32-高级定时器

以STM32F407为例。 高级定时器 高级定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车&#xff08;断路&#xff09;功能&#xff0c;这些功能都是针对工业电机控制方面。 功能框图 16位向上、向下、向上/向下自动重装载计数器。 16位可编程预分频器&#xff0c…

软件测试/测试开发丨利用ChatGPT 生成自动化测试脚本

点此获取更多相关资料 简介 自动化测试脚本可以模拟用户与应用程序的交互&#xff0c;例如点击按钮、输入数据、导航到不同的页面等等&#xff0c;以验证应用程序的正确性、性能和稳定性。 自动化测试在回归测试、冒烟测试等测试流程中都可以极大地起到节省时间、节省人力的作…

第二十六章 BEV感知系列三(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 BEV感知系列是对论文Delving into the De…