数据结构-顺序存储二叉树

文章目录

目录

文章目录

前言

一 . 什么是顺序存储二叉树

二 . 模拟实现

前序遍历

总结


前言

大家好,今天给大家讲一下顺序存储二叉树


一 . 什么是顺序存储二叉树

顺序存储二叉树是一种将二叉树的节点按照从上到下、从左到右的顺序存储在数组中的方法。具体来说,顺序存储二叉树将二叉树的根节点存储在数组的第一个位置,然后按照从上到下、从左到右的顺序将二叉树的其他节点依次存储在数组中。

对于任意一个节点的索引为i(i从1开始),其左子节点的索引为2i右子节点的索引为2i+1。这样,通过数组的索引关系,可以方便地找到节点的父节点、左子节点和右子节点。

顺序存储二叉树的优点是可以使用数组的随机访问特性快速找到节点,不需要通过指针进行遍历。缺点是当二叉树的节点数较少时,可能会浪费较多的存储空间。此外,如果二叉树需要进行频繁的插入和删除操作,顺序存储二叉树的效率会较低。

 顺序存储二叉树的特点:

1)顺序二叉树通常只考虑完全二叉树

2)n个元素的左子节点为  2 * n + 1

3)n个元素的右子节点为  2 * n + 2

4)n个元素的父节点为  (n-1) / 2

5)n : 表示二叉树中的第几个元素(0开始编号如上图所示)

二 . 模拟实现

准备工作

// 编写一个ArrBinaryTree类,实现顺序存储二叉树遍历
class ArrBinaryTree{private int[] arr;// 存放数据节点的数组public ArrBinaryTree(int[] arr){this.arr = arr;}}
需求: 给你一个数组{1,2,3,4,5,6,7} 要求以二叉树前中后序遍历的方式进行遍历

前序遍历

思路分析

  1. 定义一个指针变量index,初始值为1,表示从根节点开始遍历。
  2. 从数组中取出索引为index的节点,并对其进行操作(如打印节点值)。
  3. 将index的值更新为其左子节点的索引,即index = 2 * index。
  4. 重复步骤2和步骤3,直到index超出数组的范围或者取出的节点为空。
  5. 如果index超出数组的范围,则遍历结束;否则,将index的值更新为其右子节点的索引,即index = 2 * index + 1。
  6. 重复步骤2到步骤5,直到index超出数组的范围。

代码实现

    public void preOrder(int index){// 如果数组为空或array.length == 0,直接返回if(arr == null || arr.length == 0){System.out.println("二叉树为空");return;}System.out.println(arr[index]);// 左递归if(index*2+1 < arr.length){preOrder(2*index+1);}// 右递归if(index*2+2 < arr.length){preOrder(index*2 +2);}}

 过程图解

 中序遍历和后序遍历过程和上图无本质区别,直接看代码

 /*** 顺序存储二叉树中序遍历* @param index 数组下标*/public void infixOrder(int index) {// 如果数组为空或array.length == 0,直接返回if (arr == null || arr.length == 0) {System.out.println("二叉树为空");return;}// 左递归if(index*2+1 < arr.length){preOrder(2*index+1);}System.out.println(arr[index]);// 右递归if(index*2+2 < arr.length){preOrder(index*2 +2);}}/*** 顺序存储二叉树后序遍历* @param index 数组下标*/public void postOrder(int index){// 如果数组为空或array.length == 0,直接返回if (arr == null || arr.length == 0) {System.out.println("二叉树为空");return;}// 左递归if(index*2+1 < arr.length){preOrder(2*index+1);}if(index*2+2 < arr.length){preOrder(index*2 +2);}System.out.println(arr[index]);// 右递归}


总结

大家根据图解过程应该很好理解,没什么难点,我们下一篇博客见。

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

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

相关文章

文件操作 和 IO - 详解

一&#xff0c;认识文件 1.1 树形结构组织和目录 文件是对于"硬盘"数据的一种抽象&#xff0c;在一台计算机上&#xff0c;有非常多的文件&#xff0c;这些文件是通过 "文件系统" 来进行组织的&#xff0c;本质上就是通过 "目录"(文件夹) 这样…

WebGoat 靶场 JWT tokens 四 五 七关通关教程

文章目录 webGoat靶场第 四 关 修改投票数第五关第七关 你购买书&#xff0c;让Tom用户付钱 webGoat靶场 越权漏洞 将webgoat-server-8.1.0.jar复制到kali虚拟机中 sudo java -jar webgoat-server-8.1.0.jar --server.port8888解释&#xff1a; java&#xff1a;这是用于执行…

MySQL命令行中文乱码问题

MySQL命令行中文乱码问题&#xff1a; 命令行界面默认字符集是gbk&#xff0c;若字符集不匹配会中文乱码或无法插入中文。 解决办法&#xff1a;执行set names gbk; 验证&#xff1a; 执行命令show variables like ‘char%’;查看默认字符集。 创建数据库设置字符集utf8&…

2023旅游产业内容营销洞察报告:如何升级经营模式,适配社媒新链路

2023年我国旅游业强劲复苏&#xff0c;上半年旅游消费增长显著&#xff0c;政府出台一系列文旅扶持政策后&#xff0c;旅游业也在积极寻求数字化转型的升级方式。 上半年以旅游消费为代表的服务业对经济的增长贡献率超过60%&#xff0c;旅游企业普遍实现经营好转&#xff0c;企…

【FPGA零基础学习之旅#14】串口发送字符串

&#x1f389;欢迎来到FPGA专栏~串口发送字符串 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指正…

电脑散热——液金散热

目录 1.简介 2.传统硅脂与液金导热区别 3.特点 4.优点 5.为什么液金技术名声不太好 6.使用方法 1.简介 凡是对于电脑基础硬件有所了解的人&#xff0c;都知道硅脂是如今高性能电脑设备中必不可少的东西。芯片表面和散热器接触面&#xff0c;虽然肉眼看上去是非常光滑的金属…

C (1094) : DS双向链表—前驱后继

Description 在双向链表中&#xff0c;A有一个指针指向了后继节点B&#xff0c;同时&#xff0c;B又有一个指向前驱节点A的指针。这样不仅能从链表头节点的位置遍历整个链表所有节点&#xff0c;也能从链表尾节点开始遍历所有节点。 对于给定的一列数据&#xff0c;按照给定的…

C#封装、继承和多态的用法详解

大家好&#xff0c;今天我们将来详细探讨一下C#中封装、继承和多态的用法。作为C#的三大面向对象的特性&#xff0c;这些概念对于程序员来说非常重要&#xff0c;因此我们将对每个特性进行详细的说明&#xff0c;并提供相应的示例代码。 目录 1. 封装&#xff08;Encapsulati…

ElementUI结合Vue完成主页的CUD(增删改)表单验证

目录 一、CUD ( 1 ) CU讲述 ( 2 ) 编写 1. CU 2. 删除 二、验证 前端整合代码 : 一、CUD 以下的代码基于我博客中的代码进行续写 : 使用ElementUI结合Vue导航菜单和后台数据分页查询 ( 1 ) CU讲述 在CRUD操作中&#xff0c;CU代表创建&#xff08;Create&#xff09…

我做了一个简易P图(参数图)分析软件

P图(即参数图&#xff0c;Parameter Diagram)&#xff0c;是一个结构化的工具&#xff0c;帮助大家对产品更好地进行分析。 典型P图格式 P图最好是和FMEA软件联动起来&#xff0c;如国可工软的FMEA软件有P图分析这个功能。 单纯的P图分析软件很少&#xff0c;为了方便做P图分…

Elasticsearch:多语言语义搜索

在此示例中&#xff0c;我们将使用多语言嵌入模型 multilingual-e5-base 对混合语言文档的 toy 数据集执行搜索。 使用这个模型&#xff0c;我们可以通过两种方式进行搜索&#xff1a; 跨语言&#xff0c;例如使用德语查询来查找英语文档在非英语语言中&#xff0c;例如使用德…

【C++】多线程的学习笔记(2)——白话文版(bushi

目录 前一篇 本章内容提要 使用mutex锁的原因 mutex锁的概念 mutex的使用教程 锁的声明以及命名 mutex的加锁以及解锁 例子 结果 注意 mutex的其他方式的锁介绍 lock_guard 介绍 例子 运行结果 adopt_lock参数 unique_lock 介绍 try_to_lock defer_lock re…

iOS开发 通过分析UMeng的错误详情解决crash问题

iOS开发 通过分析UMeng的错误详情解决crash问题 在项目中获取崩溃信息很重要。在iOS开发调试以及上线之后&#xff0c;程序经常会出现Crash问题。比较常见的第三方crash分析工具是使用友盟、百度、crashlytics等。第三方crash分析工具&#xff0c;甚至还带了符号化crash日志的…

设计模式 - 七大软件设计原则

目录 一、设计模式 1.1、软件设计原则 1.1.1、开闭原则 1.2.2、单一职责原则 1.2.3、里氏替换原则 1.2.4、迪米特原则 1.2.5、接口隔离原则 1.2.6、依赖倒转原则 1.2.7、合成/聚合复用原则 一、设计模式 1.1、软件设计原则 1.1.1、开闭原则 开闭原则&#xff1a;对扩…

Docker 日志管理 - ELK

Author&#xff1a;rab 目录 前言一、Docker 日志驱动二、ELK 套件部署三、Docker 容器日志采集3.1 部署 Filebeat3.2 配置 Filebeat3.3 验证采集数据3.4 Kibana 数据展示3.4.1 创建索引模式3.4.2 Kibana 查看日志 总结 前言 如何查看/管理 Docker 运行容器的日志&#xff1f;…

1.Linux入门基本指令

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 01.ls指令 02.pwd指令 03.cd指令 04.touch指令 05.mkdir指令(重要) 06.rmdir&&rm指令(重要) 07.man指令(重要) 08.cp指令(重要) 09.mv指令(重要) 10.cat指令 nano指令 echo指令 输出重定向 追加重…

当 FineReport 遇见 CnosDB

随着大数据和物联网应用的快速发展&#xff0c;时序数据库成为了一种关键的数据存储和分析工具。而 FineReport 作为一款流行的商业智能工具&#xff0c;与时序数据库 CnosDB 的集成可以为企业提供更强大的数据分析和可视化功能。本博客将介绍如何将 FineReport 与 CnosDB 集成…

架构师-软件工程习题选择题

架构师-软件工程习题选择题

SpringBoot-黑马程序员-学习笔记(一)

8.pom文件中的parent 我们使用普通maven项目导入依赖时&#xff0c;通常需要在导入依赖的时候指定版本号&#xff0c;而springboot项目不需要指定版本号&#xff0c;会根据当前springboot的版本来下载对应的最稳定的依赖版本。 点开pom文件会看到这个&#xff1a; 继承了一个…

【Redis】基础数据结构-简单动态字符串SDS

C语言字符串 char *str "redis"; // 可以不显式的添加\0&#xff0c;由编译器添加 char *str "redis\0"; // 也可以添加\0代表字符串结束C语言中使用char*字符数组表示字符串&#xff0c;‘\0’来标记一个字符串的结束&#xff0c;不过在使用的过程中我…