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

news2024/11/19 1:53:00

文章目录

目录

文章目录

前言

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

二 . 模拟实现

前序遍历

总结


前言

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


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

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

对于任意一个节点的索引为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.coloradmin.cn/o/1064960.html

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

相关文章

Jackson 的 SNAKE_CASE 反序列化

最近项目中有关 JSON 的序列化和反序列化中&#xff0c;我们遇到了一个问题就是 category_id 我们在定义对象的时候使用的是 categoryId。 当程序进行反序列化的时候&#xff0c;我们获得的对象值为 NULL。 这是因为 jackson 提供了一个命名规则&#xff0c;如果你是希望进行…

FISCO BCOS(三十七)———FISCOBCOS应用开发,交易hash、区块高度的获取

这个需求怎么做? 交易hash的获取方式有很多,这里先介绍一种方式。 根据块高查询区块信息 https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE-Front/interface.html那我们如何知道现在的区块高度是多少? https://webasedoc.readthedocs.io/zh_CN/latest/docs/W…

谦卑篇(Be humble)//伟大是用卑微来换取的,任何时候都应该看清自己

1. 宇宙诞生138亿年&#xff0c;地球迄今经过了46亿个春秋&#xff0c;人生不过百年&#xff0c;//从生命科学的角度。 2. 蔡崇信&#xff1a;好的领导者是很谦卑的&#xff0c;他们会用谦卑雇佣来能力更强的人。// 从创业者的角度。 3. 《臣服实验》&#xff1a; 臣服生命之流…

新版Ai企业级系统去授权版本完美运行

Ai企联系统去授权版新鲜出炉 一款市面上新出的AI企联系统&#xff0c;一款市面上新出的AI企联系统 项目uniapp开发的&#xff0c;支持3.5 4.0 Mj 此套系统5端适配&#xff0c;WebH5微信小程序抖音小程序双端APP&#xff0c;支持流量主! 好像有能力的快手小程序那些也可以上…

高通camx开源部分学习简介

camera整体框架 sensor 上电&#xff0c;通过 MIPI协议传输&#xff0c;得到RAW图像数据。RAW图像数据经过ISP处理&#xff0c;得到YUV图像数据。YUV图像数据再经过DMA传输到DDR内存中&#xff0c;DDR内存也就是上图中标识的HOST。每个厂家的 ISP原理和功能大致相同&#xff0c…

Qt中 QMap 类、QHash 类、QVector 类详解

目录 一、QMap 类 1.插入数据信息 2.删除数据信息 3.迭代器 4.STL类型迭代 5.key键/T键查找 6.修改键值 7. 一个键对应多个值 直接使用QMultiMap类来实例化一个QMap对象 二、QHash 类 三、QVector类 一、QMap 类 QMap<Key,T>提供一个从类型为 Key 的键到类型为…

制作电商页面(Html)

任务 制作一个电商页面&#xff0c;要求所卖物品清晰&#xff0c;页面色调清晰&#xff0c;要有主页和详情页。 网站所买物品&#xff1a;书籍 色调&#xff1a;#FF2400 橙红色 代码 主页HTML代码&#xff1a; <html><head><meta charset"utf-8"…

力扣 -- 647. 回文子串

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int countSubstrings(string s) {int ns.size();vector<vector<bool>> dp(n,vector<bool>(n));//无需初始化int ret0;//一定要从下往上填写每一行for(int in-1;i>0;i--){//每一行的i…

Selenium基础

最近在学习爬虫的有关知识&#xff0c;发现一个很有意思的工具Selenium&#xff0c;所以打算花点时间看Selenium提供的手册来学习&#xff0c;为了防止以后忘记和方便复习&#xff0c;打算记录一下我的学习过程&#xff0c;我使用的Selenium版本是4.8.2。 目录 Selenium概述 网…

C++设计模式-享元(Flyweight)

目录 C设计模式-享元&#xff08;Flyweight&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-享元&#xff08;Flyweight&#xff09; 一、意图 运用共享技术有效地支持大量细粒度的对象。 二、适用性 一个应用程序使用了大量的对象。完全由…

【RabbitMQ】初识消息队列 MQ,基于 Docker 部署 RabbitMQ,探索 RabbitMQ 基本使用,了解常见的消息类型

文章目录 前言一、初识消息队列 MQ1.1 同步通信1.2 异步通信1.3 MQ 常见框架及其对比 二、初识 RabbitMQ2.1 什么是 RabbitMQ2.2 RabbitMQ 的结构 三、基于 Docker 部署 RabbitMQ四、常见的消息类型五、示例&#xff1a;在 Java 代码中通过 RabbitMQ 发送消息5.1 消息发布者5.2…

【数据库——MySQL】(15)存储过程、存储函数和事务处理习题及讲解

目录 1. 题目1.1 存储过程1.2 存储函数1.3 事务处理 2. 解答2.1 存储过程2.2 存储函数2.3 事务处理 1. 题目 1.1 存储过程 创建表 RandNumber &#xff1a;字段&#xff1a;id 自增长&#xff0c; data int&#xff1b; 创建存储过程向表中插入指定个数的随机数&#xff08;1-…

UDP通信程序的详细解析

2.UDP通信程序 2.1 UDP发送数据 Java中的UDP通信 UDP协议是一种不可靠的网络协议&#xff0c;它在通信的两端各建立一个Socket对象&#xff0c;但是这两个Socket只是发送&#xff0c;接收数据的对象&#xff0c;因此对于基于UDP协议的通信双方而言&#xff0c;没有所谓的客户端…

MySql017——组合查询UNION和UNION ALL

一、UNION作用 可用UNION操作符来组合数条SQL查询。 二、UNION 使用规则 1、UNION的使用很简单。所需做的只是给出每条SELECT语句&#xff0c;在各条语句之间放上关键字UNION。2、UNION必须由两条或两条以上的SELECT语句组成&#xff0c;语句之间用关键字UNION分隔&#xff…

Hive 【Hive(七)窗口函数练习】

窗口函数案例 数据准备 1&#xff09;建表语句 create table order_info (order_id string, --订单iduser_id string, -- 用户iduser_name string, -- 用户姓名order_date string, -- 下单日期order_amount int -- 订单金额 ); 2&#xff09;装载语句 i…

代码随想录算法训练营第五十八天 | 动态规划 part 16 | 583. 两个字符串的删除操作、72. 编辑距离

目录 583. 两个字符串的删除操作思路思路2代码 72. 编辑距离思路代码 583. 两个字符串的删除操作 Leetcode 思路 dp[i][j]&#xff1a;以i-1为结尾的字符串word1&#xff0c;和以j-1位结尾的字符串word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数。递推公…

【AI视野·今日NLP 自然语言处理论文速览 第四十八期】Thu, 5 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 5 Oct 2023 Totally 50 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Retrieval meets Long Context Large Language Models Authors Peng Xu, Wei Ping, Xianchao Wu, Lawrence McA…

算法题:摆动序列

这道题是一道贪心算法题&#xff0c;如果前两个数是递增&#xff0c;则后面要递减&#xff0c;如果不符合则往后遍历&#xff0c;直到找到符合的。&#xff08;完整题目附在了最后&#xff09; 代码如下&#xff1a; class Solution(object):def wiggleMaxLength(self, nums):…

【力扣-每日一题】714. 买卖股票的最佳时机含手续费

class Solution { public:int maxProfit(vector<int>& prices, int fee) {//[i][0]-不持有 [i][1]-持有int mprices.size();vector<vector<int>> dp(m,vector<int>(2));dp[0][0]0; //初始状态dp[0][1]-prices[0];for(int i1;i<m;i){dp[i]…

光伏发电预测(LSTM、CNN_LSTM和XGBoost回归模型,Python代码)

光伏太阳能电池通过互连形成光伏模块&#xff0c;以捕捉太阳光并将太阳能转化为电能。因此&#xff0c;当光伏模块暴露在阳光下时&#xff0c;它们会产生直流电。这是目前将太阳能转化为电能的最佳方式之一。世界上许多国家已经采用了这项技术&#xff1b;然而&#xff0c;光伏…