二叉树和堆

本文详细探讨了树的基本概念,包括树的表示方法,重点介绍了二叉树特性及两种常见存储结构——顺序存储和链式存储。接着深入剖析了堆的数据结构,包括堆的定义、特点以及代码实现,涉及最小堆和最大堆的应用。适合理解非线性数据结构和算法实现的读者。

目录

树的概念

树的表示

二叉树概念

二叉树存储结构

顺序存储

 链式存储

堆的代码实现


树的概念

树是一种非线性的数据结构,因为看起来像一棵倒挂的树,因此得名。

如图是一棵树,1没有父节点所以是根节点,3,5,6没有子节点所以是叶节点。

树的特点

1.子树是不相交的。

2.除了根节点外,每个节点有且仅有一个父节点。

3.一颗N个结点的树有N-1条边。

树的表示

树有多种表示方式,如:双亲表示法,孩子表示法,孩子兄弟表示法,最简单的孩子兄弟表示法。

typedef int DataType;
struct Node
{
  struct Node* _firstChild1;//孩子
  struct Node* _pNextBrother;//兄弟
  DataType _data;            //表示法
};

目录的实现就可以用树来实现。

二叉树概念

特点:

1.二叉树最多有两棵子树,即二叉树不存在 度大于2的结点。

2.二叉树的子树有左右之分,其子树的次序不能颠倒。

特殊的二叉树有满二叉树和完全二叉树。

二叉树存储结构

有顺序结构和链式结构

顺序存储

顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。二叉树顺序存储在物理上是一个数组,在逻辑上是一棵二叉树。

 链式存储

用链表表示一棵二叉树,即用链来指示元素的逻辑关系。

struct BinaryTreeNode//二叉链表
{
  struct BinaryTreeNode* _pLeft;
  struct BinaryTreeNode* _pRight;
  BTDataType _data;
};

堆是特殊的树。

特点:

1.堆是完全二叉树。

2.堆的字节点必须小于或大于双亲结点。

根结点为最小值是最小堆,为最大值是最大堆。

堆的代码实现

typedef int HPDataType;
typedef struct Heap
{
  HPDataType* _a;
  int _size;
  int _capacity;
}Heap;


// 堆的构建
void HeapCreate(Heap* hp, HPDataType* a, int n);
// 堆的销毁
void HeapDestory(Heap* hp);
// 堆的插入
void HeapPush(Heap* hp, HPDataType x);
// 堆的删除
void HeapPop(Heap* hp);
// 取堆顶的数据
HPDataType HeapTop(Heap* hp);
// 堆的数据个数
int HeapSize(Heap* hp);
// 堆的判空
int HeapEmpty(Heap* hp);
// 对数组进行堆排序
void HeapSort(int* a, int n);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学c的长弓狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值