数据结构 -- 二叉树的存储结构

二叉树的存储结构

顺序存储

#define MaxSize 100
struct TreeNode{ElemType value;		//结点中的数据元素bool isEmpty;		//结点元素是否为空
};//定义一个长度为MaxSize的数组t,按照从上至下、从左至右的顺序依次完成存储完全二叉树中的各个节点
TreeNode t[MaxSize];
for (int i = 0;i<MaxSize;i++){t[i].isEmpty = true;		//初始化所有结点为空
}

几个重要常考的基本操作:

i 的左孩子 – 2i

i 的右孩子 – 2i+1

i 的父节点 – [i/2]

i 所在的层次 – [log2(n+1)]或[log2n]+1

【注意】如果是一颗普通的二叉树,依然按照层序将各节点顺序存储,那么结点间是没有上述的对应关系的

⭐所以在二叉树的顺序存储中,一定需要将二叉树的节点编号与完全二叉树对应起来

【存在问题】在最坏情况下,高度为h的且只有h个节点的单只树(所有结点只有右孩子),也至少需要2^h-1个存储单元

链式存储

//二叉树的结点(链式存储)
typedef struct BiTNode{ElemType data;						//数据域struct BiTNode * lchild,*rchild;	//左右孩子
}BiTNode,*BiTree;

⭐n个结点的二叉链表共有n+1个空链域(可以用于构造线索二叉树)

struct ElemType{int value;
};typedef struct BiTNode{ElemType data;						//数据域struct BiTNode *lchild,*rchild;		//左右孩子指针
}BiTNode,*BiTree;//定义一颗空树
BiTree root = NULL://插入根结点
root = (BiTree)malloc(sizeof(BiTNode));
root->data = {1};
root->lchild = NULL;
root->rchild = NULL;//插入新结点
BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
p->data = {2};
p->lchild = NULL;
p->rchild = NULL;
root ->lchild = p;		//作为根结点的左孩子

找到指定结点p的左右孩子 – p->lchild; p->rchild;

找到指定结点p的父节点 – 只能从根节点开始遍历

【解决】如果经常需要寻找父节点,可以使用三叉链表(添加一个父结点指针)

//二叉树的结点(链式存储)
typedef struct BiTNode{ElemType data;						//数据域struct BiTNode *lchild,*rchild;		//左右孩子指针struct BiTNode *parent;				//父结点指针(根据实际需要决定要不要添加)
}BiTNode,*BiTree;

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

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

相关文章

Linux系统移植篇(十一)Linux 内核启动流程

要分析 Linux 启动流程&#xff0c;同样需要先编译一下 Linux 源码&#xff0c;因为有很多文件是需要编译才 会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds&#xff0c;通过链接脚本可以 找到 Linux 内核的第一行程序是从哪里执行的。vmlinux.lds …

【Docker入门】构建推送第一个Docker映像

【Docker入门】构建推送第一个Docker映像 Build and Push the First Docker Image By JacksonML Docker的容器(Container)映像是轻量级的可执行独立包&#xff0c;包含代码、运行时、库、环境变量以及配置文件&#xff0c;它对于运行软件至关重要。注册表可在团队间分享映像。…

【eNSP实战】(续)一个AC多个VAP的实现—将隧道转发改成直接转发

在 一个AC多个VAP的实现—CAPWAP隧道转发 此篇文章配置的基础上&#xff0c;将隧道转发改成直接转发 一、改成直接转发需要改动的配置 &#xff08;一&#xff09;将连接AP的接口改成trunk口&#xff0c;并允许vlan100、101、102通过 [AC1]interface GigabitEthernet 0/0/8 …

SPI 总线协议

1、协议介绍 SPI&#xff0c;是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。 SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。主节点或子节点的数据在…

我爱学算法之——滑动窗口攻克子数组和子串难题(上)

现在来学习"滑动窗口"这一算法思想。 至于什么是"滑动窗口"呢&#xff1f;简单来说就是同向双指针&#xff1b;现在来通过题目来了解什么是"滑动窗口" 一、长度最小的子数组 题目链接&#xff1a;长度最小的子数组 题目解析 先来看题目&#…

ora-600 ktugct: corruption detected---惜分飞

接手一个oracle 21c的库恢复请求,通过Oracle数据库异常恢复检查脚本(Oracle Database Recovery Check)脚本检测之后,发现undo文件offline之后,做了resetlogs操作,导致该文件目前处于WRONG RESETLOGS状态 尝试恢复数据库ORA-16433错误 SQL> recover datafile 1; ORA-00283:…

20. Excel 自动化:Excel 对象模型

一 Excel 对象模型是什么 Excel对象模型是Excel图形用户界面的层次结构表示&#xff0c;它允许开发者通过编程来操作Excel的各种组件&#xff0c;如工作簿、工作表、单元格等。 xlwings 是一个Python库&#xff0c;它允许Python脚本与Excel进行交互。与一些其他Python库&#x…

IIS 服务器日志和性能监控

Internet Information Services &#xff08;IIS&#xff09; 是 Microsoft 提供的一款功能强大、灵活且可扩展的 Web 服务器&#xff0c;用于托管网站、服务和应用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供网页的协议&#xff0c;因此广泛用于企业环境。 IIS 的…

jenkins pipline 自动化测试

以下是一个典型的 Jenkins Pipeline 示例&#xff0c;用于执行自动化测试流程&#xff08;支持单元测试、集成测试、代码质量扫描&#xff09;&#xff0c;包含多阶段执行和测试结果处理&#xff1a; pipeline {agent anyenvironment {// 定义环境变量PROJECT_NAME "my-…

APP测试

一、APP测试范围 功能测试性能测试&#xff1a;CPU、内存占用、启动速度、流量、电量消耗、流畅度、稳定性专项测试&#xff1a;安装卸载升级、push消息推送 、交叉事件测试 、用户体验测试 、兼容性测试 二、APP包发布方式及策略 分类&#xff1a; 内部发布渠道。如&#x…

12 File文件对象:创建、获取基本信息、遍历文件夹、查找文件;字符集的编解码 (黑马Java视频笔记)

文章目录 File >> 存储数据的方案1. 认识File2. File操作2.1 创建File对象2.2 File操作1&#xff09;对文件对象的信息的操作2&#xff09;文件/文件夹的创建/删除3&#xff09;⭐⭐对文件夹的遍历 3. 方法递归3.1 认识递归3.2 递归算法及其执行流程1) 案例&#xff1a;2…

oracle 基础知识之 多表查询

多表查询定义&#xff1a;当查询的数据并不是来源一个表时&#xff0c;需要使用多表连接操作完成查询。多表连接查询通过表之间的关联字段&#xff0c;一次查询出多个表的数据。多表查询包括了等值连接、左连接、右连接、完全连接。 1.等值连接 等值连接也称为简单连接&#xf…

服务器防火墙根据什么特征来过滤数据包?

防火墙是服务器安全防护的第一道屏障&#xff0c;它的主要作用是监控、过滤和控制进出服务器的数据流量&#xff0c;防止恶意攻击、非法访问和数据泄露。防火墙通过分析数据包的特定特征来决定是否允许、拒绝或限制数据的传输。 服务器防火墙的基本工作原理&#xff1a; 防火墙…

Prims region.Views 为null

原因&#xff1a; 导航未完成或异步问题 解决方式&#xff1a;使用回调确认导航完成后再操作视图 _regionManager.RequestNavigate("MonitorRegion", "MonitorView", nps, navigationResult > {if (navigationResult.Result true){var region _regio…

reconstruct_3d_object_model_for_matching例子

文章目录 1.获取om3文件2.准备可视化3.准备3D可视化4.读取3D模型5.显示成对注册结果16.显示成对注册结果27.联合注册模型8.处理图像8.1子采样8.2 图像计算与平滑8.3 三角测量 9.基于表面做3D匹配10.评估模型准确度10.1 在场景中找到模型10.2 计算模型和场景之间的距离 11.立体系…

软件安全性测试的重要性和常用工具介绍,软件测试服务公司推荐

在当今数字化快速发展的时代&#xff0c;软件已经成为各行各业不可或缺的一部分。然而&#xff0c;随着软件系统的复杂性增加&#xff0c;安全性问题也愈发突出&#xff0c;因此软件产品生产周期中安全测试必不可少。软件安全性测试是指对软件系统进行评估&#xff0c;以发现潜…

Redis项目:短信验证码登录

这是黑马的黑马点评项目&#xff0c;短信验证码的业务。一开始是使用session做的&#xff0c;后来重构&#xff0c;使用redis缓存来完成。 第一层拦截器&#xff1a; public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stri…

Docker下载,包含Win、Mac

介绍 Docker 是一种开源的容器化平台&#xff0c;通过操作系统级虚拟化技术实现应用的快速开发、部署和运行。以下从多个维度对 Docker 进行详细介绍&#xff1a; 一、Docker 的核心概念与功能 容器化技术 Docker 利用 Linux 内核的容器隔离技术&#xff08;如 Cgroups 和 Nam…

使用 ESP8266 和 Android 应用程序实现基于 IOT 的语音控制家庭自动化

使用 ESP8266 实现基于 IOT 的语音控制家庭自动化 欢迎来到另一个令人兴奋的项目,我们将使用 Wi-Fi 模块构建一个语音控制ESP8266家庭自动化系统,您可以在其中通过语音通过 Android 应用程序从世界任何地方控制您的家用电器。是的,您只需使用语音命令即可打开或关闭负载(L…

【HarmonyOS Next】鸿蒙中自定义弹框OpenCustomDialog、CustomDialog与DialogHub的区别详解

【HarmonyOS Next】鸿蒙中自定义弹框OpenCustomDialog、CustomDialog与DialogHub的区别详解 一、三者的区别与关系 1. 官方迭代过程为&#xff1a; CustomDialog 》 OpenCustomDialog 》 DialogHub 迭代过程表明&#xff0c;弹框的调用越来越便捷&#xff0c;与UI解耦&…