以下实现的是一个基于数组存储的完全二叉树
完全二叉树特征:
层序存储位置(k, p)与数组位置(i)之间的关系:i = 2^(p-1) + (q -1)
数组中,结点(p)与左子树(i)的位置关系:i = 2*p + 1
数组中,结点(p)与右子树(i)的位置关系:i = 2*p + 2
数组中,子结点(p)与父亲结点(i)的位置关系:i = (p + 1) / 2 - 1
深度 k 与 结点数 n 之间的关系: n <= (2^k - 1)
// BinaryTree
// BinaryTree
#include
#include
#include
// 定义两个常量
#define MAXSIZE 100// 存储空间初始分配量
#define MAX_TREE_SIZE 100// 二叉树最大结点数
#define TRUE 1
#define FALSE 0
#define STATUS_OK 1
#define STATUS_FAILED 0
typedef int TElemType;
typedef TElemType BinaryTree[MAX_TREE_SIZE];
// 定义二叉树的数据结构
typedef struct
{
int level; // 结点的层
int order; // 本层序号
}Position;
TElemType Nil = 0; // 定义TElemType的空类型
// 构造空二叉树
void InitBiTree(BinaryTree T)
{
for (int i = 0; i < MAX_TREE_SIZE; i++)
{
T[i] = Nil;
}
}
#define ClearBiTree InitBiTree // 在顺序存储结构中,两函数完全一样
int BiTreeEmpty(BinaryTree T)
{
if (T[0] == Nil)
{
return TRUE;
}
else
{
return FALSE;
}
}
void visit(TElemType e)
{
printf(" %d ", e);
}
int Root(BinaryTree T, TElemType* e)
{
if (!BiTreeEmpty(T)) { // 不空,e赋值根结点
*e = T[0];
return STATUS_OK;
} else { // 空,返回错误状态
return STATUS_FAILED;
}
}
// 深度计算
// 利用了性质:深度为k的二叉树的结点数: