数据结构之二叉树的性质与存储结构

数据结构之二叉树的性质与存储结构

  • 1、二叉树的性质
  • 2、二叉树的存储结构

  数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用计算机解决问题的效率服务。
  数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的 逻辑结构,数据元素及元素之间关系的存储称为 存储结构(或物理结构)。数据结构按照逻辑关系的不同分为 线性结构非线性结构两大类,其中,非线性结构又可分为树结构和图结构。
  树结构是一种非常重要的非线性结构,该结构中的一个数据元素可以有两个或两个以上的直接后继元素,树可以用来描述客观世界中广泛存在的层次结构关系。
  二叉树是 n(n≥0)个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两棵不相交的且分别称为左、右子树的二叉树所组成。可见,二叉树具有递归性质。

1、二叉树的性质

  (1)二叉树第 i 层(i≥1)上最多有 2i-1 个结点。
  (2)高度为 k 的二叉树最多有 2k-1 个结点 (k≥1)。
  由性质 1,每一层的结点数都取最大值 Σ i = 1 k 2 i − 1 = 2 k − 1 {\huge\Sigma}^k_{i=1}2^{i-1} = 2^k-1 Σi=1k2i1=2k1 即可。
  (3)对于任何一棵二叉树,若其终端结点数为 n0,度为2的结点数为 n2,则n0=n2+1。
  (4)具有n 个结点的完全二叉树的深度为[log2n]+1。
  若深度为 k 的二叉树有 2k-1 个结点,则称其为满二叉树。可以对满二叉树中的结点进行连续编号: 约定编号从根结点起,自上而下、自左至右依次进行。深度为 k、有 n 个结点的二叉树,当且仅当其每一个结点都与深度为 k 的满二叉树中编号从1至n 的结点一一对应时,称之为完全二叉树。满二叉树如下图 (a)所示,高度为 3 的一个完全二叉树如下图 (b) 所示。
在这里插入图片描述

  在一个高度为 h 的完全二叉树中,除了第 h 层(即最后一层),其余各层都是满的。在第 h 层上的结点必须从左到右依次放置,不能留空。下图 © 所示的二叉树不是完全二叉树,因为 6号结点的左边有空结点。
在这里插入图片描述

2、二叉树的存储结构

  (1)二叉树的顺序存储结构
  顺序存储是用一组地址连续的存储单元存储二叉树中的结点,必须把结点排成一个适当的线性序列,并且结点在这个序列中的相互位置能反映出结点之间的逻辑关系。
  用一组地址连续的存储单元存储二叉树中的结点,必须把结点排成一个适当的线性序列,并且结点在这个序列中的相互位置能反映出结点之间的逻辑关系。对于深度为 k 的完全二叉树,除第k层外,其余各层中含有最大的结点数,即每一层的结点数恰为其上一层结点数的两倍,由此从一个结点的编号可推知其双亲、左孩子和右孩子的编号。
  假设有编号为 i 的结点,则有:
  ● 若 i=1,则该结点为根结点,无双亲;若 i>1,则该结点的双亲结点为[i/2]。
  ● 若 2≤n,则该结点的左孩子编号为 2i,否则无左孩子。
  ● 若 2i+1≤n,则该结点的右孩子编号为 2i+1,否则无右孩子。
  完全二叉树的顺序存储结构如下图所示。
在这里插入图片描述

  显然,完全二叉树采用顺序存储结构既简单又节省空间,对于一般的二叉树,则不宜采用顺序存储结构。因为一般的二叉树也必须按照完全二叉树的形式存储,也就是要添上一些实际并不存在的“虚结点”,这将造成空间的浪费,如下图所示。
在这里插入图片描述

  在最坏情况下,一个深度为 k 且只有 k 个结点的二叉树(单支树) 需要 2k-1 个存储单元。
  (2)二叉树的链式存储结构
  由于二叉树的结点中包含有数据元素、左子树的根、右子树的根及双亲等信息,因此可以用三叉链表或二叉链表(即一个结点含有 3 个指针或两个指针)来存储二叉树,链表的头指针指向二叉树的根结点,如下图所示。
在这里插入图片描述

  设结点中的数据元素为整型,则二叉链表的结点类型定义如下:

typedef struct BiTnode{
	int    data;
	struct BiTnode *lchild,*rchild;
}BiTnode.*BiTree;

  在不同的存储结构中,实现二叉树的运算方法也不同,具体应采用什么存储结构,除考虑二叉树的形态外还应考虑需要进行的运算特点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Helm Dashboard — Kubernetes 中管理 Helm 版本的 GUI

Helm Dashboard 通过提供图形用户界面,使在 Kubernetes 中管理 Helm 版本变得更加容易,这是许多开发人员所期望的。它可用于在 Kubernetes 中创建、部署和更新应用程序的版本,并跟踪其状态。 本文将探讨 Helm Dashboard 提供的特性和优势&am…

plt.animation绘制动画

目录 一:介绍 二:创建线动画 一:介绍 matplotlib.animation 是 Matplotlib 库中的一个模块,用于创建动画。它提供了多种工具和函数,使您能够轻松地创建各种类型的动画。 二:创建线动画 import numpy as…

机器视觉技术与应用实战(平均、高斯、水平prewitt、垂直prewitt、水平Sobel、垂直Sobel、拉普拉斯算子、锐化、中值滤波)

扯一点题外话,这一个月经历了太多,接连感染了甲流、乙流,人都快烧没了,乙流最为严重,烧了一个星期的38-39度,咳嗽咳到虚脱。还是需要保护好身体,感觉身体扛不住几次连续发烧!&#x…

hdu 4507 吉哥系列故事——恨7不成妻

吉哥系列故事——恨7不成妻 题意 一个正整数和 7 7 7 有关当且仅当满足以下条件之一: 数位中某一位是 7 7 7数位和能被 7 7 7 整除这个整数能被 7 7 7 整除 统计 [ l , r ] [l,r] [l,r] 内所有和 7 7 7 无关 的数字的 平方和 思路 这道题需要一点思维。我…

Excel·VBA合并工作簿2

其他合并工作簿的方法,见之前的文章《ExcelVBA合并工作簿》 目录 8,合并文件夹下所有工作簿中所有工作表,按表头汇总举例 8,合并文件夹下所有工作簿中所有工作表,按表头汇总 与之前的文章《ExcelVBA合并工作簿&#x…

【51单片机Keil+Proteus8.9】控制步进电机+LCD1602显示状态

步进电机控制 设计思路 电路设计: 选用AT89C51单片机作为电路核心部件,外加LM016L液晶显示屏作为显示,显示步进电机的Fast,Slow,Stop的三个状态将AT89C51单片机所选引脚与LM016L控制引脚相连,再将数据通…

Self-RAG:通过自我反思学习检索、生成和批判

论文地址:https://arxiv.org/abs/2310.11511 项目主页:https://selfrag.github.io/ Self-RAG学习检索、生成和批评,以提高 LM 的输出质量和真实性,在六项任务上优于 ChatGPT 和检索增强的 LLama2 Chat。 问题:万能L…

Python入门到精通(四)——Python函数

Python函数 一、函数的定义 二、函数的参数及返回值 1、函数的参数 2、函数的返回值 三、函数说明文档 四、函数的嵌套调用 五、变量的作用域 六、综合案例 一、函数的定义 定义: 调用: 函数:是组织好的,可重复使用的&…

第04章_IDEA的安装与使用(上)(认识,卸载与安装,JDK相关设置,详细设置,工程与模块管理,代码模板的使用)

文章目录 第04章_IDEA的安装与使用(上)本章专题与脉络1. 认识IntelliJ IDEA1.1 JetBrains 公司介绍1.2 IntelliJ IDEA 介绍1.3 IDEA的主要优势:(vs Eclipse)1.4 IDEA 的下载 2. 卸载与安装2.1 卸载过程2.2 安装前的准备2.3 安装过程2.4 注册2…

浪之潮科技:动力恢复清积碳,尾气治理三元催化修复

针对汽车出现油耗增加、动力减弱以及尾气检测不合格等情况,深圳市浪之潮科技有限公司(以下简称:浪之潮科技)求真务实、勇于创新,独创两大系统六大部位——动力恢复清积碳、尾气治理三元催化修复,为广大车主…

大模型 RAG 面试篇

1.LLMs 存在模型幻觉问题,请问如何处理? 检索LLM。 先用问题在领域数据库里检索到候选答案,再用LLM对答案进行加工。 2.基于LLM向量库的文档对话 思路是怎么样? 加载文件读取文本文本分割文本向量化问句向量化在文本向量中匹配…

软件测试工程师简历项目经验怎么写?

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

探索世界,从一款好用的浏览器开始!

好用的浏览器分享 在这个数字化的时代,浏览器已经成为了我们生活中不可或缺的工具。从浏览新闻、社交媒体到工作学习,我们几乎无时无刻不在与浏览器打交道。那么,如何选择一款好用的浏览器呢?今天,我就来为大家分享几…

Java毕业设计-基于springboot的学习英语管理系统-第89期

获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于springbootvue的医院管理系统:前端 vue、bootstrap、coreui,后端 maven、springmvc、spring、mybatis、redis,角色分为管理员、医…

2024年简历石沉大海,别投了,软件测试岗位饱和了....

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

SpringMVC传递数据给前台

SpringMVC有三种方式将数据提供给前台 第一种 使用Request域 第二种 使用Model(数据默认是存放在Request域中) 与第一种方式其实是一致的 第三种 使用Map集合(数据默认是存放在Request域中)

Appium 环境配置

Appium 是一个开源的、跨平台的测试框架,可以用来测试 Native App、混合应用、移动 Web 应用(H5 应用)等,也是当下互联网企业实现移动自动化测试的重要工具。Appium 坚持的测试理念: •无需用户对 App 进行任何修改或…

git提交代码到远端仓库的方法详解

一、何为git git就是版本控制器,就比如说你新建了一个git文件夹,里面用于存放你的C语言实习报告,现在要用git对该文件夹进行接管。当你修改了你的C语言实习报告点击保存之后,就用git的相关命令,提交给git,让…

Mybatis面试题(三)

MyBatis 面试题 21、MyBatis 实现一对多有几种方式,怎么操作的? 有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过在resultMap 里面的 collection 节点配置一对多的类就可以完成;嵌套查询是先查一个表,根据这个表里面的 结果的外键 id,…

Js-WebAPIs-事件流(三)

• 事件流与两个阶段说明 事件流指的是事件完整执行过程中的流动路径 说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段 简单来说:捕获阶段是 从父到子 冒泡阶段是从子到父 实际工作都是…