一、树的概念
注意,树的同一层中不能有关联,否则就不是树了,就变成图了。例如 B 和 C 存在关联,这就不是树了。
有关树的一些重要概念:

二、二叉树
1. 二叉树的概念
二叉树由一个根节点加上两棵别称为左子树和右子树的二叉树组成。 它具有两个特点:不存在度大于 2 的节点;子树有左右之分,次序不能颠倒,故二叉树是有序树。
各类型二叉树集合:

2. 特殊类型的二叉树
满二叉树:所有非叶子节点都有两个子节点,且所有叶子节点都在同一层。 完全二叉树:除了最后一层,每一层都是满的,且最后一层的叶子节点都尽可能靠左排列。 二叉排序树:左子树所有节点的值小于根节点的值,右子树所有节点的值大于根节点的值,且左右子树也分别是二叉排序树。

3. 二叉树的性质
(1)对于具有 n 个节点的完全二叉树,如果按照从上到下从左到右的顺序对所有节点从 0 开始编号,则序号为 i 的节点有:其双亲节点序号为 (i-1)/2;其左孩子节点序号为 i2+1,右孩子节点序号为 i2+2,注意 i2+1 和 i2+2 要小于 n,合法性。
(2)规定根节点层数为 1,具有 n 个节点的满二叉树深度为 h=log2(n+1)。
(3) 规定根节点层数为 1,第 i 层最大节点数为 2^(i-1)。
(4) 规定根节点层数为 1,深度为 h 的二叉树的最大节点数为 2^h-1。
4. 二叉树存储的结构
分为顺序存储结构和链式存储结构,其中用顺序存储结构来实现完全二叉树就是接下来重点介绍的堆。
链式存储:用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。
顺序存储:顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。
三、堆
1. 堆的概念
堆可以看作一种特殊类型的完全二叉树,分为大堆和小堆,根节点最大的称为大堆,根节点最小的称为小堆。
大堆:谁大谁当爹,但兄弟间无绝对大小关系。
小堆:谁小谁当爹,但兄弟间无绝对大小关系。
2. 堆的实现
升序:建大堆 降序:建小堆
接下来给出建小堆的代码实现:
Heap.h
#include
HDataType;
HDataType* arr;
size;
capacity;
} Heap;
;
;
;
HDataType ;
;
;
;


