二叉树的存储结构

📙作者简介: 清水加冰,目前大二在读,正在学习C/C++、Python、操作系统、数据库等。

📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。

欢迎点赞 👍 收藏 ⭐留言 📝 如有错误还望各路大佬指正!

✨每一次努力都是一种收获,每一次坚持都是一种成长✨       

在这里插入图片描述

目录

 前言

1. 二叉树的存储结构

1.1 链式存储结构

1.2 二叉树的顺序存储

1.2.1 树的双亲表示法

1.2.2 堆

 2. 拓展

总结


 

 前言

        二叉树的存储结构是指如何将二叉树的节点和它们之间的关系表示出来,以便于对二叉树进行操作和遍历。在二叉树的存储结构中,我们有多种选择,每种选择都有其独特的优势和适用场景。从链式存储到顺序存储,再到堆存储,每种方法都有不同的空间和时间复杂度,并且适用于不同的应用场景。


1. 二叉树的存储结构

        二叉树的存储结构可以分为两大类:

一、顺序结构存储

二、链式结构存储

1.1 链式存储结构

        二叉树的链式存储结构,顾名思义就是使用链表来表示二叉树,使用链表来表示二叉树的结构,通常是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。如下图:

 二叉链的定义:

struct BinaryTreeNode
{
struct BinTreeNode* pLeft; // 指向当前节点左孩子
struct BinTreeNode* pRight; // 指向当前节点右孩子
BTDataType data; // 当前节点值域
};

        链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面学到高阶数据结构如红黑树等会用到三叉链。如下图:

 三叉链的定义:

struct BinaryTreeNode
{
struct BinTreeNode* pParent; // 指向当前节点的双亲
struct BinTreeNode* pLeft; // 指向当前节点左孩子
struct BinTreeNode* pRight; // 指向当前节点右孩子
BTDataType data; // 当前节点值域
};

1.2 二叉树的顺序存储

         二叉树的顺序存储对二叉树是有一定要求的,普通的二叉树不适合使用顺序存储,会造成空间上的浪费。如下图:

        只要完全二叉树才可以使用顺序存储

如下图: 

 那么数组存储的原理或者说逻辑是什么?

1.2.1 树的双亲表示法

 使用顺序存储的表示方法有多种,如双亲表示法:孩子节点只存储双亲的下标 如下图:

         A没有父亲所以存储的是-1,B和C的父亲是A,A的下标是0,所以B、C存储的都是A的数组下标。D、E的父亲是B,所以D、E存储的B的下标即1……

        我们也可以通过这样的方法来判断有多少棵树,在后续的学习中我们还会遇到森林,森林就是有多颗树组成的结构,如果节点为树的根就存储-1,我们可以计算-1的个数就可以判断树的数量。

1.2.2 堆

        说到二叉树的顺序存储,这里就要引入一个新的概念——堆。堆又可以分为2种:

大堆:大堆的子节点不得大于父节点。

小堆:小堆的子节点不得小于父节点。

 大堆:

小堆:

         通过观察我们可以发现数组在存储二叉树的节点时是按照从左到右,逐层存储的,所以,在给出的任意一个数组,都可能组成一个二叉树(逻辑上),从数组如何变换到二叉树的树形结构呢?其实也很简单。数组的首元素必定是二叉树的根,然后根据完全二叉树的特性进行逐层分割。

以上图的小堆为例:

10可以作为一个二叉树的根:

        那我们在写代码的时候要如何去判断根节点的子节点呢?前辈们已经总结出了规律:

leftChild=parent*2+1;
rightChild=parent*2+2;parent=(Child-1)/2;//或者 parent=(Child-2)/2

        任何一个节点都可以下标找到它的父节点。看到堆的顺序存储,我们也会很容易联想到栈的顺序存储。我们可以来对比一下:

栈:是一种线性表,具有先进后出的特性。

堆:是非线性结构,只能是完全二叉树。

 2. 拓展

 堆的底层:

堆在物理层面,正如我们所看到的顺序存储,是数组。

在逻辑层面,它是一颗完全二叉树。

那么问题来了,堆一定是有序的吗?

        根据上边的两个例子,答案已将显而易见了,不一定。堆的头一定是整个数组中的最值(最大或最小) 。既然堆是数组,那我们也是可以对堆进行排序的,这里旧会引入后续会学习的——堆排序。

 那么堆排序它有什么价值呢?

        我们知道冒泡排序的时间复杂度是O(N^2),而堆排序的时间复杂度是O(NlogN),它们的效率可是天差地别,例如我们以100W个数为例,冒泡要执行1万亿次,而堆排序只需要2000万次,它们相差多少次。

 其次就是topk问题,什么是topk问题?

topk问题就是找出最大或最小的前k个。拓展部分目前仅为了解内容,后续都会进行介绍。


总结

        通过本篇博客,我们深入探讨了二叉树的存储结构,包括链式存储、顺序存储、堆存储。每种存储方式都有其独特的优点和适用场景,希望本篇博客能够为读者提供有价值的知识和见解,帮助大家更好地理解和应用二叉树的存储结构。让我们一起在二叉树的世界中探索,发现更多的可能性!

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

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

相关文章

Android lint配置及使用

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、将 lint 配置为不显示警告3.1 在 A…

多维时序 | MATLAB实现GWO-GRU灰狼算法优化门控循环单元的多变量时间序列预测

多维时序 | MATLAB实现GWO-GRU灰狼算法优化门控循环单元的多变量时间序列预测 目录 多维时序 | MATLAB实现GWO-GRU灰狼算法优化门控循环单元的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现基于GWO-GRU灰狼算法优化门控循环单元的多变量时…

船舶稳定性和静水力计算——绘图体平面图,静水力,GZ计算(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Java入门第三季

一、异常与异常处理 1. 异常简介 在Java中,**异常是程序在执行过程中出现的问题或意外情况,导致程序无法按照预期的流程进行。**异常处理是Java中用于处理程序中出现的异常的一种机制。 Java中的异常可以分为两大类:受检查的异常&#xff…

2023国赛数学建模B题思路分析 - 多波束测线问题

# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播, 在不同界面上产生反射, 利用这一原理,从测量船换能器垂直向海底发射声波信 号,并记录从声波发射到…

Linux服务使用宝塔面板搭建网站,并发布公网访问 - 内网穿透

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

【ALM工具软件】上海道宁与Perforce为您带来用于整个生命周期的应用程序生命周期管理软件

Helix ALM是 用于整个生命周期的 应用程序生命周期管理的ALM软件 具有专用于 需求管理(Helix RM)、测试用例管理(Helix TCM) 问题管理(Helix IM)的功能模块 Helix ALM提供了 无与伦比的可追溯性 您将…

【解决】mysqladmin flush-hosts

问题 mysql出现 mysqladmin flush-hosts,是因为其他客户机连接错误次数过多时,mysql会禁止客户机连接。 解决方法 1、进入服务器数据库,打开数据库命令行界面输入 flush hosts; 此时便可连接 2、可以.修改mysql配置文件,在[…

LeetCode(力扣)46. 全排列Python

LeetCode46. 全排列 题目链接代码 题目链接 https://leetcode.cn/problems/permutations/ 代码 class Solution:def backtracking(self, nums, result, path, used):if len(path) len(nums):result.append(path[:])for i in range(len(nums)):if used[i]:continuepath.app…

2023年MySQL-8.0.34保姆级安装教程

重点放前面:演示环境为windows环境。 MySQL社区版本安装教程如下: 一、MySQL安装包下载二、安装配置设置三、配置环境变量 大体分为3个步骤:①安装包的下载;②安装配置设置;③配置环境变量 一、MySQL安装包下载 下载官…

docker 生成镜像的几个问题

docker 生成镜像的几个问题 根据jdk8.tar.gz 打包Jdk8 镜像失败运行镜像报错差不多是网络ip错误,在网上说重启docker即可解决运行mysql5.7.25 镜像失败向daemon.json文件添加内容导致docker重启失败docker run 命令常用参数根据jdk8.tar.gz 打包Jdk8 镜像失败 首选做准备工作…

核货宝:收银系统后台一般是怎样的,有哪些功能

收银系统后台是一个重要的管理工具,它为企业提供了对收银机的全面控制和配置。收银系统后台是一个用于管理和配置收银机的软件界面。它通常由以下几个主要部分组成: 1. 登录和权限管理 收银系统后台需要一个安全的登录系统,以确保只有授权人…

使用命令行创建仓库

如果你还没有任何代码,可以通过命令行工具创建一个全新的Git仓库并初始化到本项目仓库中。 git clone https://e.coding.net/***/neurosens.git cd neurosens echo "# neurosens" >> README.md git add README.md git commit -m "first commi…

Pygame中Trivia游戏解析6-1

1 Trivia游戏简介 Trivia的含义是“智力测验比赛中的各种知识”。Trivia游戏类似智力竞赛,由电脑出题,玩家进行作答,之后电脑对玩家的答案进行判断,给出结果并进行评分。该游戏的界面如图1所示。 图1 Trivia游戏界面 2 游戏流程 …

基于SpringBoot的社团管理系统

基于SpringBootVue的社团管理系统,前后端分离 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/Ecilpse、Navicat、Maven 角色:普通用户、管理员 管理员:…

咪蒙团队转型做短剧行业,年收入近2个亿

我是卢松松,点点上面的头像,欢迎关注我哦! 很多人不知道咪蒙是谁,他曾经是公众号时代的no.1,她发一篇带广告的推文大几十万, 那个时候不知道带动多少人去做公众号,2019年发表不恰当文章而被封禁。 但最近我看到一则新…

【数据结构】二叉树的顺序结构实现及时间复杂度计算(二)

目录 一,二叉树的顺序结构实现 1,二叉树的顺序结构 2,堆的概念及结构 3,堆的接口实现 1,堆的创建 2,接口函数 3,初始化 4,销毁 5,是否增容 6,交换数据…

【线性表】

好久没更新啦,来喽来喽~~~ 喏,看这个图,什么意思呢?先容大家思考思考...... 目录: 1.线性表的定义 2.线性表的抽象数据类型 3.线性表的顺序存储结构 (1)顺序存储定义 (2&#x…

LeetCode 面试题 02.07. 链表相交

文章目录 一、题目二、C# 题解 一、题目 给你两个单链表的头节点 headA 和 headB,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。 图示两个链表在节点 c1 开始相交:   题目数据 保证 整个链式结构中不存在环。…

Vue + Element UI 前端篇(九):接口格式定义

接口请求格式定义 前台显示需要后台数据,我们这里先把前后端交互接口定义好,没有后台的时候,也方便用mock模拟。 接口定义遵循几个规范: 1. 接口按功能模块划分。 系统登录:登录相关接口 用户管理:用户…