二叉树和堆的概念和特点
Posted 银背欧尼酱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树和堆的概念和特点相关的知识,希望对你有一定的参考价值。
文章目录
前言
本篇文章将带大家了解二叉树和堆。二叉树和堆的外形非常相似,都是一个下宽上窄的金字塔结构,常常让人傻傻分不清楚。这篇文章将介绍二叉树和堆的概念,区别,以及他们的特点。
一、树
1.1 树的概念
树是一种非线性的数据结构,它是由若干个有限节点组成起来的,一种有层次关系的集合。他的根朝上,而叶朝下。
1.2 树的特点
-
根结点是树最上面的的结点,它没有前驱结点。
-
除根节点外,树的其他根结点被分为若干个子树,每一个子树都有一个自己的根节点和若干自己的子树
-
除根结点外,每个结点有一个前驱和若干的后继
-
树是递归的
1.3 孩子兄弟表示法
树的表示法有很多,如:双亲表示法,孩子表示法,孩子兄弟表示法等。这里只介绍最常用的孩子兄弟表示法:
typedef int DataType;
struct Node
{
struct Node* _firstChild1; // 第一个孩子结点
struct Node* _pNextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
二,二叉树
2.1 二叉树的特点
二叉树也是树,它和一般的树相比具备的特点是:
- 每个结点最多有两棵子树,即二叉树不存在度大于2的结点
- 二叉树的子树有左右之分,且子树的顺序不能颠倒
2.2 二叉树的性质
1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1) 个结点.
2.若规定根节点的层数为1,则深度为i的二叉树的最大结点数2^i- 1.
3.对任何一棵二叉树, 如果度为0其叶结点个数为 n0, 度为2的分支结点个数为 n2,则有n0=n2+1
4.若规定根节点的层数为1,具有n个结点的满二叉树的深度**,**h=Log2(n+1). (ps:Log2(n+1)是log以2为底,n+1为对数)
5.对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有:
(1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点
(2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n否则无左孩子
(3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n否则无右孩子
2.3 二叉树存储结构
2.3.1 顺序存储结构
顺序存储结构实际就是用数组来存储,只适合完全二叉树,不适合一般的二叉树,因为不是完全二叉树会有空间的浪费。二叉树顺序存储结构在物理上是一个数组,在逻辑上是一颗二叉树
2.3.2 链式存储结构:
二叉树的链式存储结构是值,用链表来表示一颗二叉树,即用链来表示元素的逻辑关系。通常的方法是链表中每个节点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链接点的存储地址。
代码示例:
// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* pLeft; // 指向当前节点左孩子
struct BinTreeNode* pRight; // 指向当前节点右孩子
BTDataType data; // 当前节点值域
}
2.4二叉树(堆)的顺序存储结构及实现
上面已经讲到,普通的二叉树不适合用数组来存储,因为可能会存在大量的空间浪费,只有完全二叉树适合使用顺序存储结构。下面我们来介绍一个新的概念:堆
2.4.1堆的概念和结构
这里我们所说的堆是一种数据结构,和操作系统内存管理中的堆是两回事。
堆的概念:
将一个集合K = {k0,k1, k2,…,kn-1},把所有元素都按照完全二叉树的顺序存储方式来存储,并且满足每个子树的根结点数值都大于等于(或小于等于)他们各自的子结点数值,这样的结构就叫堆。将根节点最大的堆叫大堆,根节点最小的堆叫小堆。
堆得性质:
堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一颗完全二叉树
总结
综上所述:二叉树分为:1.完全二叉树,2.满二叉树,3.堆,4.其他二叉树。堆是一种特殊的二叉树,二叉树的顺序存储结构很多时候都是用在堆这种数据结构上。在下一篇文章会介绍堆的创建以及其他基本操作。希望大家能有所收获。
以上是关于二叉树和堆的概念和特点的主要内容,如果未能解决你的问题,请参考以下文章