首页 > 其他分享 >数据结构入门——二叉树(中)

数据结构入门——二叉树(中)

时间:2024-03-18 20:58:43浏览次数:21  
标签:11 struct 17 入门 65 数据结构 节点 二叉树

通过《二叉树(上)》的学习,我们已经对二叉树有了基本的了解,那我们现在继续深入了解二叉树。

二叉树的存储结构

顺序存储

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面会专门讲解。

二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。 

链式存储

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面学到高阶数据结构如红黑树等会用到三叉链。

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
 struct BinTreeNode* _pParent; // 指向当前节点的双亲
 struct BinTreeNode* _pLeft; // 指向当前节点左孩子
 struct BinTreeNode* _pRight; // 指向当前节点右孩子
 BTDataType _data; // 当前节点值域
};

二叉树的顺序结构及实现

二叉树的顺序结构

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

堆的概念及结构

在二叉树中,堆(Heap)是一种特殊的数据结构,通常用于实现优先队列。堆分为最大堆和最小堆两种类型:

1. 最大堆(Max Heap):在最大堆中,父节点的值始终大于或等于其子节点的值。也就是说,根节点是整个堆中的最大值。

2. 最小堆(Min Heap):在最小堆中,父节点的值始终小于或等于其子节点的值。也就是说,根节点是整个堆中的最小值。

堆的性质

  • 堆中某个节点的值总是不大于或不小于其父节点的值;
  • 堆总是一棵完全二叉树。

练一练

1.下列关键字序列为堆的是:()

A 100,60,70,50,32,65

B 60,70,65,50,32,100

C 65,100,70,32,50,60

D 70,65,100,32,50,60

E 32,50,100,70,65,60

F 50,100,70,65,60,32

2.已知小根堆为8,15,10,21,34,16,12,删除关键字 8 之后需重建堆,在此过程中,关键字之间的比较次 数是()。

A 1 B 2 C 3 D 4

3.一组记录排序码为(5 11 7 2 3 17),则利用堆排序方法建立的初始堆为

A(11 5 7 2 3 17)

B(11 5 7 2 17 3)

C(17 11 7 2 3 5)

D(17 11 7 5 3 2)

E(17 7 11 3 5 2)

F(17 7 11 3 2 5)

4.最小堆[0,3,2,5,7,4,6,8],在删除堆顶元素0之后,其结果是()

A[3,2,5,7,4,6,8]

B[2,3,5,7,4,6,8]

C[2,3,4,5,7,8,6]

D[2,3,4,5,6,7,8]

答案

1.A 2.C 3.C 4.C

堆的实现

堆向下调整算法

现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整 成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。

int array[] = {27,15,19,18,28,34,65,49,25,37};

以27为根的左右子树,都满足小堆的性质,只有根节点不满足,因此只需将根节点往下调整到合适的位置即可形成堆。

堆的创建

下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算法,把它构建成一个堆。根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的 子树开始调整,一直调整到根节点的树,就可以调整成堆。

int a[] = {1,5,3,8,7,6}; 

 

标签:11,struct,17,入门,65,数据结构,节点,二叉树
From: https://blog.csdn.net/Lucas_Micheal/article/details/136690411

相关文章

  • C语言数据结构链表(无头结点)功能实现(增,删,改,查)
    #include<stdio.h>#include<stdlib.h>typedefstructLNode{   int data;   struct   LNode*next;}LNode,*LinkList; boolInitList(LinkList&L){    L=NULL;    return0; }boolinsert(LinkList&L,inti,intx){       ......
  • 二叉树|二叉树理论基础、二叉树的递归遍历
    代码随想录(programmercarl.com)树和二叉树1.树的基本概念1.1树的定义1.2树的逻辑表示方法1.3树的基本术语1.4树的性质1.5树的基本运算1.6树的存储结构2.二叉树的概念和性质2.1二叉树的定义2.2二叉树的性质2.3二叉树与树、森林之间的转换3.二叉树的存储结构3.1......
  • 【c++初阶】C++入门(上)
    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨......
  • 数据结构318
    1.整理链栈、循环队列的代码2.猴子吃桃问题,猴子第一天摘了若干个桃,当即就吃了一半数量的桃,没吃过瘾,又多吃一个,第二天,在剩下的桃里有吃了一半数量的桃,没吃过瘾,又多吃了一个,依此类推,直到第10天,想吃桃的时候,发现只剩下一个桃了,问:猴子第一天摘了多少个桃。(递归完成)3.整理思维导......
  • Linux命令大全(快速入门)第二部分
    Linux文件基本属性显示文件属性ls命令        Linuxls(英文全拼:listfiles)命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。参数:-a显示所有文件及目录(.开头的隐藏文件也会列出)-l除文件名称外,亦将文件型态、权限、拥有......
  • Linux命令大全(快速入门)第一部分
    Linux概述Linux内核最初只是由芬兰人林纳斯·托瓦兹1991年在赫尔辛基大学上学时出于个人爱好而编写的。Linux的各个发行版本Linux的发行版说简单点就是将Linux内核与应用软件做一个打包。1RedHatLinux2UbuntuLinux界面桌面系统3SuSELinux......
  • 数据结构(六)串,Trie字符串统计---以题为例
    维护一个字符串集合,支持两种操作:Ix 向集合中插入一个字符串 x;Qx 询问一个字符串在集合中出现了多少次。共有 N 个操作,所有输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为......
  • CNN入门级实战教程
    本教程将使用Keras构建一个简单的的卷积神经网络(ConvolutionalNeuralNetwork,CNN)来对手写数字进行识别。使用的数据集为MNIST数据集,一个包含手写数字图像的经典数据集。0.环境设置确保你已经安装了所需的库,可以通过以下方式安装:pipinstallkerascondainstallmatplotl......
  • 博弈论入门篇——「三个枪手」的心理博弈
    博弈论是一门很有趣的学科,本文将以博弈问题《三个枪手》为脉络,从零基础开始介绍博弈论,和大家一起博弈论是如何解决实际问题的。希望通过本文,让大家都能听懂博弈论。 题目:《三个枪手》三个小伙子同时爱上了一个姑娘,为了决定他们谁能娶这个姑娘,他们决定用枪进行一次决斗。A......
  • 解决问题:java、mysql、docker、linux、redis、solr适合初级或者刚入门的大学生
    java、mysql、redis、linux、docker中的问题Java问题解决,idea问题解决调试,服务器问题解决,项目部署,项目调试linux服务器上的安装以及运行环境的部署docker的部署可做技术栈:java开发:javaweb,jsp,servlet,javase,spring,springboot,ssm服务器:linux问题docker问题,To......