二叉树的构建——Java实现(详细注释 + 原理分析)

使用c语言构建二叉树时,一般是给定前序,正序遍历的方法进行遍历构建二叉树

通过使用Java中的map容器来构建二叉树,通过给定后序、中序遍历,实现层序遍历

1.后序遍历中最后一个元素为树的根节点,找到根节点的数值,并得到根节点在中序遍历中的位置,然后用来进行递归构建二叉树即可

2.层序遍历用到了bfs的深度优先搜索遍历,我们存放在list容器中,实现层序遍历的输出

代码如下:

package com.test.learn;
/*** 一个二叉树,树中每个节点的权值互不相同。* <p>* 现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。*/import java.util.*;/*** Java来实现树的构造,需要用到 Map容器,k存放结点值,v存放结点下标*/
public class 树的遍历 {static HashMap<Integer, Integer> left = new HashMap();//存放左子树static HashMap<Integer, Integer> right = new HashMap();//存放右子树static HashMap<Integer, Integer> map = new HashMap();static int post[] = new int[1000];static List<Integer> list = new ArrayList<>();public static void main(String[] args) {//我们可以通过后序遍历的最后一个元素确定树的根节点//然后根据中序遍历,结合根节点分开左右子树,通过map容器,构建二叉树Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int mid[] = new int[n];post = new int[n];for (int i = 0; i < n; i++) {post[i] = scanner.nextInt();}for (int i = 0; i < n; i++) {mid[i] = scanner.nextInt();map.put(mid[i], i);}int root = dfs(0, n, 0, n);//构建树完毕,使用bfs进行层序遍历Queue<Integer> queue = new LinkedList();queue.offer(root);//root根节点接入队列while (!queue.isEmpty()) {//在队列不为空的情况下进行入队出队操作int size = queue.size();for (int i = 0; i < size; i++) {int num = queue.poll();list.add(num);if (left.get(num) != -1) queue.offer(left.get(num));if (right.get(num) != -1) queue.offer(right.get(num));}}for(int i:list) System.out.print(i+" ");}static int dfs(int midS,int midE,int postS,int postE) {//起始位置>=等于结束位置说明当前树节点为空if(midS>=midE||postS>=postE) return -1;//得到根节点int root=post[postE-1];//得到根节点在中序中的位置int rootIdx=map.get(post[postE-1]);//左子树的长度int leftSize=rootIdx-midS;//构建左右子树left.put(root, dfs(midS,rootIdx,postS,postS+leftSize));right.put(root, dfs(rootIdx+1,midE,postS+leftSize,postE-1));return root;}}

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

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

相关文章

宁夏教育杂志社与宁夏教育编辑部

宁夏教育杂志社投稿信箱 宁夏教育杂志 编辑在线咨询QQ&#xff1a;2648025923 编辑在线咨询QQ&#xff1a; 2958409081 编辑在线咨询QQ&#xff1a; 2734638650 编辑咨询电话&#xff1a;18366155179 编辑咨询电话&#xff1a;18366155179 宁夏教育杂志投稿信箱&…

抖音无货源如何做?

抖音店铺,1688一件代发可以做吗?如何做? (一)筛选一手货源: 打开1688,选择“找工厂”而不是“找货源”来避免被二道贩子坑骗。 在搜索框中输入你想要做的抖店商品类目,筛选出来的基本上是源头厂家。 仔细查看店铺的基础信息,如射灯厂家,以确认是否为源头厂家。 (…

【软件设计师】大题

一、数据流图 基础知识 数据流图&#xff08;Data Flow Diagram,DFD&#xff09;基本图形元素&#xff1a; 外部实体&#xff08;External Agent&#xff09; 表示存在于系统之外的对象&#xff0c;用来帮助用户理解系统数据的来源和去向加工&#xff08;Process&#xff09;数…

网络安全基础技术扫盲篇 — 名词解释

网络模块基础&#xff08;网络拓扑图、网络设备、安全设备&#xff09; 用通俗易懂的话说&#xff1a; 网络拓扑图&#xff1a;它就像一张网络世界的地图&#xff0c;它展现了我们数不清的网站、服务器和设备是如何相互连接的。用简单的话说&#xff0c;它就是给我们指路、告…

一步一步写线程之十二无锁编程

一、无锁编程 无锁编程并不是真正的无锁&#xff0c;只是在软件上消除了锁&#xff08;或者说消除了传统认知中的锁&#xff09;。牺牲CPU的占用时间来换取效率。无论是传统的单线程编程还是后来的多线程编程及至并发编程&#xff0c;其实抽象出来的模型就是生产者和消费者。这…

基于移动多媒体信源与信道编码调研

前言 移动多媒体是指在移动通信环境下&#xff0c;通过无线网络传输的音频、视频、图像等多种媒体信息。移动多媒体的特点是数据量大、传输速率高、服务质量要求高&#xff0c;因此对信源编码和信道编码的性能提出了更高的要求。 本文对进3年的移动多媒体信源与信道编码的研究…

数美滑块研究

周一&#xff0c;在清晨的阳光照耀下&#xff0c;逆向山脚下的小镇宁静而安详。居民们忙碌地开始一天的生活&#xff0c;而在爬虫镇子的边缘&#xff0c;一座古朴的道观显得格外神秘。 阿羊正静静地坐在青石长凳上&#xff0c;摸鱼养神。突然&#xff0c;一道清脆的声音在他耳…

【C++】AVL树和红黑树模拟实现

AVL树和红黑树 1. 背景2. AVL树的概念3. AVL树节点的定义4. AVL树的插入5. AVL树的旋转5.1. 左单旋5.2. 右单旋5.3. 左右单旋5.4. 右左单旋5.5. 旋转总结 6. AVL树的验证7. AVL树的性能8. 红黑树的概念9. 红黑树的节点的定义10. 红黑树的插入10.1. 情况一10.2.情况二 11. 红黑树…

【建议收藏】30个较难Python脚本,纯干货分享

本篇较难&#xff0c;建议优先学习上篇 &#xff1b;20个硬核Python脚本-CSDN博客 接上篇文章&#xff0c;对于Pyhon的学习&#xff0c;上篇学习的结束相信大家对于Pyhon有了一定的理解和经验&#xff0c;学习完上篇文章之后再研究研究剩下的30个脚本你将会有所成就&…

Transformer详解(2)-位置编码

位置编码公式 偶数位置用sin,奇数位置用cos. d_model 表示token的维度&#xff1b;pos表示token在序列中的位置&#xff1b;i表示每个token编码的第i个位置&#xff0c;属于[0,d_model)。 torch实现 import math import torch from torch import nn from torch.autograd im…

pycharm配置python开发环境—miniconda+black+gitlab

下载miniconda管理python开发环境 miniconda下载地址&#xff1a;https://docs.anaconda.com/free/miniconda/ miniconda最新版本的python版本是python3.12.2&#xff0c;下载这个miniconda最新版本后&#xff0c;会导致执行conda create -n py31013 python3.10.13指令配置py…

如何设计电商 SaaS 系统中的免费服务和增值服务

随着电子商务的迅猛发展&#xff0c;越来越多的企业选择使用 SaaS&#xff08;Software as a Service&#xff09;平台来搭建自己的电商系统。为了吸引更多用户&#xff0c;电商 SaaS 系统通常会提供免费服务和增值服务。如何合理地设计这些服务&#xff0c;既能吸引新用户&…

使用HTTP长连接减少文件描述符和端口占用

在当今互联网技术飞速发展的背景下&#xff0c;高并发处理能力已经成为衡量服务器性能的一个重要标准。面对高并发场景&#xff0c;服务器需要同时应对大量的请求&#xff0c;这就带来了一个棘手的问题&#xff1a;资源有限。具体来说&#xff0c;文件描述符和端口号&#xff0…

ES实例演示一

温馨提示&#xff1a;本文所有API操作都是基于Elasticsearch 7.17 .8版本 1、文档的基本 CRUD 与批量操作 ############Create Document############ #create document. 自动生成 _id POST users/_doc {"user" : "Mike","post_date" : "20…

「公 告」根据中华人民共和国法律,Bing 在中国内地暂停 “搜索自动建议” 功能 30 天。

根据中华人民共和国法律&#xff0c;Bing 中国已经被政府有关部门要求在中国内地暂停 “搜索自动建议” 功能 30 天。作为全球性搜索平台&#xff0c;Bing 将持续致力于尊重法治与用户获取信息的权利&#xff0c;在遵守法律的前提下最大限度地帮助客户寻找所需信息。 Bing Chin…

数据结构---优先级队列(堆)

博主主页: 码农派大星. 数据结构专栏:Java数据结构 关注博主带你了解更多数据结构知识 1. 优先级队列 1.1 概念 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队 列时&am…

微软Copilot+ PC:Phi-Silica

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

Tkinter描述

Tkinter是Python中的一个标准GUI库&#xff0c;使用Tcl/Tk作为底层实现&#xff0c;提供了创建图形用户界面的工具。Tkinter提供了一组标准的GUI元素和布局管理器&#xff0c;帮助开发人员快速构建应用程序。使用Tkinter&#xff0c;可以快速创建简单的GUI应用程序&#xff0c;…

C++入门:从C语言到C++的过渡(2)

目录 1.缺省参数 1.1缺省参数的概念 1.2缺省参数的分类及使用 1.3注意点 2.函数重载 2.1函数重载的定义 2.2函数重载的情况分类 2.3注意 2.4函数名修饰规则 3.引用 3.1引用的概念 3.2注意事项 3.3常引用 4.4引用的使用场景 4.4.1作为函数的参数 4.4.2做函数返回…

【学习笔记】Windows GDI绘图目录

题外话 不知几时开始&#xff0c;觉得学习过程中将内容记录下来&#xff0c;有助于加强记忆&#xff0c;还方便后续查找&#xff0c;顺便帮助有需要的人&#xff0c;更有来自您阅读、点赞、收藏和评论时给我带来的动力与兴奋。 目录 【学习笔记】Windows GDI绘图(一)图形概述…