【做算法学数据结构】二叉树的层序遍历【二叉树】

文章目录

  • 题目
  • 二叉树
    • 二叉树描述
    • 二叉树的java描述和前序遍历、后序遍历、中序遍历
  • 题解
  • 总结以及二叉树应用场景

题目

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

示例 1:

在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]
示例 2:输入:root = [1]
输出:[[1]]
示例 3:输入:root = []
输出:[]
提示:树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000
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;}}

二叉树

二叉树描述

在这里插入图片描述

二叉树是一种常见的树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的特点是每个节点最多有两个子节点,并且子节点的顺序是有序的,即左子节点在前,右子节点在后。

二叉树的一个重要性质是,对于任意一个节点,它的左子树和右子树都是二叉树。这种递归的定义使得二叉树可以灵活地表示各种数据结构和问题。

二叉树的节点通常由一个包含数据的值和两个指向左子节点和右子节点的指针组成。节点的值可以是任意类型,如整数、字符、对象等。

二叉树可以分为以下几种类型:

  1. 满二叉树:在满二叉树中,除了叶子节点外,每个节点都有两个子节点,并且所有的叶子节点都在同一层级上。
    在这里插入图片描述
  2. 完全二叉树:在完全二叉树中,除了最后一层外,其他层的节点都是满的,并且最后一层的节点都靠左排列。

在这里插入图片描述

  1. 二叉搜索树(BST):二叉搜索树是一种特殊的二叉树,其中左子节点的值小于根节点的值,右子节点的值大于根节点的值。这个特性使得二叉搜索树可以高效地进行搜索、插入和删除操作。

  2. 平衡二叉树:平衡二叉树是一种特殊的二叉树,其中任意节点的左子树和右子树的高度差不超过1。平衡二叉树的目的是保持树的平衡,以提高搜索等操作的效率。

  3. (多叉树)B+树:B+树是一种多路搜索树,用于高效地组织和管理大量数据。它具有平衡性和范围查询的优势。B+树的非叶子节点仅存储索引,而叶子节点形成有序链表。这种结构使得B+树在数据库和文件系统等领域广泛应用。它可以减少磁盘IO操作,提高数据的检索效率。通过节点的分裂和合并,B+树保持平衡,避免了树的倾斜。叶子节点按关键字排序,使得范围查询操作高效。B+树的设计可以根据数据规模和访问模式进行调整,适应不同的需求。总之,B+树是一种强大的数据结构,为大规模数据的存储和检索提供了高效的解决方案。

二叉树可以通过多种方式进行遍历,包括前序遍历中序遍历后序遍历。这些遍历方式定义了节点的访问顺序,可以用于在二叉树中查找、打印或修改节点的值。

总结起来,二叉树是一种具有两个子节点的树形数据结构,它的灵活性和递归性质使得它在计算机科学中得到广泛应用。

二叉树的java描述和前序遍历、后序遍历、中序遍历

当然!下面是一个简单的二叉树教程,涉及使用Java语言实现二叉树的基本操作。
首先,我们需要定义一个二叉树节点的类,其中包含节点的值、左子节点和右子节点的引用。

class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int val) {this.val = val;this.left = null;this.right = null;}
}

接下来,我们可以实现一些二叉树的基本操作,如插入节点、搜索节点和遍历等。

  1. 插入节点:
public void insert(TreeNode root, int val) {if (val < root.val) {if (root.left == null) {root.left = new TreeNode(val);} else {insert(root.left, val);}} else {if (root.right == null) {root.right = new TreeNode(val);} else {insert(root.right, val);}}
}
  1. 搜索节点:
public TreeNode search(TreeNode root, int val) {if (root == null || root.val == val) {return root;}if (val < root.val) {return search(root.left, val);} else {return search(root.right, val);}
}
  1. 二叉树的遍历(前序、中序和后序):
// 前序遍历(根-左-右)
public void preorder(TreeNode root) {if (root != null) {System.out.print(root.val + " ");preorder(root.left);preorder(root.right);}
}// 中序遍历(左-根-右)
public void inorder(TreeNode root) {if (root != null) {inorder(root.left);System.out.print(root.val + " ");inorder(root.right);}
}// 后序遍历(左-右-根)
public void postorder(TreeNode root) {if (root != null) {postorder(root.left);postorder(root.right);System.out.print(root.val + " ");}
}

现在,我们可以创建一个二叉树的实例并进行操作:

public class BinaryTreeExample {public static void main(String[] args) {BinaryTreeExample example = new BinaryTreeExample();TreeNode root = new TreeNode(5);example.insert(root, 3);example.insert(root, 8);example.insert(root, 2);example.insert(root, 4);System.out.println("前序遍历:");example.preorder(root);System.out.println();System.out.println("中序遍历:");example.inorder(root);System.out.println();System.out.println("后序遍历:");example.postorder(root);System.out.println();int searchValue = 4;TreeNode result = example.search(root, searchValue);if (result != null) {System.out.println("找到节点 " + searchValue);} else {System.out.println("未找到节点 " + searchValue);}}
}

这只是一个简单的二叉树实现示例,你可以根据需要进行扩展和修改。希望这个教程能帮助你理解和实现二叉树的基本操作!

题解

以下是对给定代码的注释和题解:

/*** 通过层次遍历二叉树,将每一层的节点值存储在一个列表中,最后返回所有层的列表。** @param root 根节点* @return 每一层节点值的列表*/
public List<List<Integer>> levelOrder(TreeNode root) {// 创建一个映射表,用于存储每一层的节点值列表Map<Integer, List<Integer>> map = new HashMap<>();// 递归遍历二叉树的每个节点,并将节点值添加到对应层的列表中level(root, 0, map);// 将映射表中的值按层次顺序收集到一个列表中并返回return IntStream.range(0, map.size()).mapToObj(map::get).collect(Collectors.toList());
}/*** 辅助方法,用于递归遍历二叉树的每个节点,并将节点值添加到对应层的列表中。** @param root  当前节点* @param level 当前节点所在的层次* @param map   存储每一层节点值列表的映射表*/
public void level(TreeNode root, int level, Map<Integer, List<Integer>> map) {// 如果当前节点为空,则直接返回if (root == null) {return;}// 获取当前层的节点值列表,如果该层还没有列表,则创建一个新的列表List<Integer> list = map.computeIfAbsent(level, k -> new ArrayList<>());// 将当前节点的值添加到当前层的节点值列表中list.add(root.val);// 递归遍历左子树和右子树,并将层次加一level(root.left, level + 1, map);level(root.right, level + 1, map);
}

题解:
这段代码实现了层次遍历二叉树的功能。它使用递归的方式遍历二叉树的每个节点,并将节点值存储在一个映射表中,其中键表示节点所在的层次,值是一个列表,存储该层的节点值。最后,通过收集映射表中的值,按层次顺序返回所有层的节点值列表。

该算法的时间复杂度是O(n),其中n是二叉树中的节点数。因为我们需要遍历每个节点一次,并将其值添加到对应层的列表中。空间复杂度是O(h),其中h是二叉树的高度,因为我们使用了一个映射表来存储每一层的节点值列表。

总结以及二叉树应用场景

二叉树是一种常见的数据结构,它由节点组成,每个节点最多有两个子节点:左子节点和右子节点。二叉树在许多领域中都有广泛的应用,以下是一些常见的使用场景:

  1. 搜索和排序:二叉搜索树(BST)是一种特殊的二叉树,它具有以下性质:对于树中的每个节点,其左子树中的所有节点的值都小于它,而右子树中的所有节点的值都大于它。这使得BST非常适合用于搜索和排序操作,例如在数据库中进行索引和检索。

  2. 表达式求值:二叉表达式树可以用于解析和求值数学表达式。通过将表达式转换为树的形式,可以方便地对表达式进行求值和计算。

  3. 文件系统:文件系统的目录结构可以用二叉树来表示,其中每个节点代表一个目录或文件,左子节点表示当前目录的子目录,右子节点表示当前目录的兄弟目录。

  4. 无线路由器:在无线路由器中,二叉树常用于实现路由表。每个节点表示一个IP地址的前缀,左子节点表示匹配该前缀的较长前缀,右子节点表示匹配该前缀的较短前缀。这种结构可以快速查找最匹配的路由。

  5. Huffman编码:Huffman编码是一种用于数据压缩的算法,它利用二叉树来构建可变长度编码。频率较高的字符被赋予较短的编码,而频率较低的字符被赋予较长的编码,从而实现数据的高效压缩。

总之,二叉树在搜索、排序、表达式求值、文件系统、网络路由和数据压缩等领域都有广泛的应用。它的灵活性和高效性使得它成为许多问题的解决方案之一。

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

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

相关文章

力扣HOT100 - 98. 验证二叉搜索树

解题思路&#xff1a; class Solution {public boolean isValidBST(TreeNode root) {return recur(root,Long.MIN_VALUE,Long.MAX_VALUE);}public boolean recur(TreeNode root,long lower,long upper){if(rootnull) return true;if(root.val<lower||root.val>upper) re…

python爬虫之爬取携程景点评价(5)

一、景点部分评价爬取 【携程攻略】携程旅游攻略,自助游,自驾游,出游,自由行攻略指南 (ctrip.com) import requests from bs4 import BeautifulSoupif __name__ __main__:url https://m.ctrip.com/webapp/you/commentWeb/commentList?seo0&businessId22176&busines…

爬虫零基础学习,第一天,安装环境,requests库常用命令的讲解

Python爬虫 爬虫学习思路 URL内容获取&#xff0c;requests的基本常用语法 import requests # 先向目标网站发送请求 url "http://www.baidu.com" r requests.get(url) # 可以用看一下访问码返回值是不是200&#xff0c;若是200则表示访问成功 print(r.status_…

Web3与物联网:探索区块链如何驱动智能设备的未来

引言 在数字化快速发展的时代&#xff0c;Web3技术和物联网&#xff08;IoT&#xff09;都成为了前沿技术的代表。两者的结合正逐渐展现出无限的可能性&#xff0c;尤其是在智能设备和数据安全方面。本文将深入探讨Web3如何与物联网相结合&#xff0c;以及这种结合对未来智能设…

现货白银价格走势分析别走弯路!

参与现货白银投资离不开对其价格走势的分析&#xff0c;虽然相关的分析方法有很多种&#xff0c;但说到直观高效的方法&#xff0c;技术分析就是很多专业投资者所钟爱的选择。投资者可以通过平台交易软件所自带的技术指标和画线工具&#xff0c;来辅助自己的分析&#xff0c;实…

UltraScale+的10G/25G Ethernet Subsystem IP核使用

文章目录 前言一、设计框图1.1、xxv_ethernet_01.2、xxv_ethernet_0_sharedlogic_wrapper1.3、xxv_ethernet_0_clocking_wrapper1.4、xxv_ethernet_0_common_wrapper 二、IP核配置三、仿真四、上板测速五、总结 前言 前面我们学习了很多基于XILINX 7系列的高速接口使用&#x…

【SpringBoot整合系列】SpringBoot配置多数据源

目录 背景技术选型配置多数据源思路(以两个为例)代码实现1.导入依赖2.各自的配置 3.各自的dataSourcenews数据库的smbms数据库的注意&#xff1a;Primary注解 4.各自的SqlSessionFactory等news数据库的smbms数据库的 5.去掉启动类头上的MapperScan6.各自的mapper接口7.各自的ma…

力扣HOT100 - 230. 二叉搜索树中第K小的元素

解题思路&#xff1a; class Solution {List<Integer> list new ArrayList<>();public int kthSmallest(TreeNode root, int k) {dfs(root);return list.get(k - 1);}public void dfs(TreeNode root) {if (root null) return;dfs(root.left);list.add(root.val)…

【Netty框架问题总结】

文章目录 Netty初步认识Netty简单介绍为什么jdk已经实现了NIO还要用netty框架&#xff1a; Reactor 线程模型Reactor 单线程模型Netty线程模型 Netty 简单实现EchoClient端实现&#xff1a;ClientHandler实现EchoServer实现ServerHandler实现&#xff1a; Netty初步认识 Netty…

【VSCode调试技巧】Pytorch分布式训练调试

最近遇到个头疼的问题&#xff0c;对于单机多卡的训练脚本&#xff0c;不知道如何使用VSCode进行Debug。 解决方案&#xff1a; 1、找到控制分布式训练的启动脚本&#xff0c;在自己的虚拟环境的/lib/python3.9/site-packages/torch/distributed/launch.py中 2、配置launch.…

检查*.bib参考文献是否重复

安装bibtexparser pip install bibtexparser 代码 import bibtexparser from difflib import SequenceMatcherdef parse_bib_file(filename):with open(filename, r, encodingutf-8) as bibfile:bib_database bibtexparser.load(bibfile)return bib_database.entriesdef fi…

Python构建学生信息管理系统:构建RESTful API - 学生信息管理系统的后端逻辑

在之前的博客里&#xff0c;我们已经完成了项目初始化&#xff0c;在本篇博客中&#xff0c;我们将深入探讨如何使用Flask框架实现学生信息管理系统的后端逻辑&#xff0c;特别是通过RESTful API来实现学生信息的增删改查&#xff08;CRUD&#xff09;操作。 Flask RESTful AP…

【Java】HOT100 回溯

目录 理论基础 一、组合问题 LeetCode77&#xff1a;组合 LeetCode17&#xff1a;电话号码的字母组合 LeetCode39&#xff1a;组合总和 LeetCode216&#xff1a;组合总和ii LeetCode216&#xff1a;组合总和iii 二、分割问题 LeetCode131&#xff1a;分割回文串 Leet…

单片机通讯协议

参考&#xff1a;江科大单片机教程 STM32入门教程-2023版 细致讲解 中文字幕_哔哩哔哩_bilibili IIC通讯协议SPI通信协议UARTCANUSB速度100k-400khz4Mhz-线数2 CLK,DATA4CLK,ENB,IO,OI额外设备一主多从一主多从 一般不用自己写&#xff0c;都有相应的库或官方提供相应的&#…

element中file-upload组件的提示‘按delete键可删除’,怎么去掉?

问题描述 element中file-upload组件会出现这种提示‘按delete键可删除’ 解决方案&#xff1a; 这是因为使用file-upload组件时自带的提示会盖住上传的文件名&#xff0c;修改一下自带的样式即可 ::v-deep .el-upload-list__item.is-success.focusing .el-icon-close-tip {d…

【国家环保协会】中华环保联合会水治理专业委员会 | 推动企业发展,加强资源共享

会员招募 会员权益 一、享受双铜牌认证服务&#xff1b; 二、为会员单位颁发证书&#xff0c;并为委员颁发聘书&#xff1b; 三、优先为企业提供创新技术、产品科技成果评价鉴定&#xff1b; 四、协助单位会员建立专业领域团体标准&#xff1b; 五、协助会员组织发起公益活…

揭秘亚马逊、虾皮自养号测评:提升排名与流量的新策略

亚马逊一直是跨境电商平台中的佼佼者&#xff0c;每年新入驻亚马逊的商家也是非常多的&#xff0c;对于新入驻的卖家来说&#xff0c;如何在竞争激烈的市场中脱颖而出&#xff0c;增加流量并转化为订单&#xff0c;是摆在面前的重要任务。 一、亚马逊新店怎么增加流量&#xf…

Langchain-Chatchat修改加载显卡

NLP - LLM - Langchain-Chatchat修改加载显卡 一、Langchain-Chatchat存在问题二、 Langchain-Chatchat加载显卡配置1. 模型加载的位置2. 函数中提供模型加载GPU的配置&#xff0c;但是不生效 三、 修改Langchain-Chatchat加载显卡配置1. 第一步修改&#xff08;create_model_w…

Simulink从0搭建模型02-仿真时间、求解器、数据类型、delay模块

参考博客 b站视频 【Simulink 0基础入门教程 P3 仿真时间、求解器、数据类型、delay模块介绍】 个人听了这个博主的视频风格觉得很适合我入门学习&#xff0c;讲得很清楚。 另外&#xff0c;视频里面教得很详细了&#xff0c;我也不会再详细写怎么打开创建等步骤&#xff0c;…

可视化大屏的应用(15):智慧城市中的十大价值

可视化大屏在智慧城市领域的十大应用价值如下&#xff1a; 实时数据监控&#xff1a; 可视化大屏可以将城市各种实时数据&#xff0c;如交通流量、环境监测、能源消耗等数据&#xff0c;以图表、地图等形式展示&#xff0c;帮助城市管理者实时监控城市运行状况。 智慧交通管理…