普通树在线性内存中存储表示方法
想把树类型结构的非线性数据存储到计算机的线性存储,就发明了以下几种表示方法:
一.双亲表示法
总结:本次通过用数组实现,如下范例
优点:求父节点方便
/************************************************************************/
/* 双亲表示法 */
/************************************************************************/
//实现是通过结构体的数组
//优点:求根节点方便
#define MAX_TREE_NODE 100
struct ParentTreeNode
{
void *data; //数据
// 无父节点为-1,其余位置号为数组的索引
int parentNum; //双亲位于数组中的索引号
};
struct ParentTree
{
ParentTreeNode treeNode[MAX_TREE_NODE]; //节点数组(所有节点集合)
int nCount; //有效节点个数
};
//////////////////////////////////////////////////////////////////////////
二.孩子表示法
总结:本次通过用数组实现,如下范例
优点:求子节点(孩子节点)方便
-----第一种
//////////////////////////////////////////////////////////////////////////
//实现是通过结构体的数组
//孩子表示法
//优点:求子节点方便
//数据重复
struct ChildTreeNode
{
void *data; //数据
//指向子节点的指针变量,无子节点为NULL,有则继续指向下一个新子节点
ChildTreeNode* pChildNext;
};
struct ChildTree
{
ChildTreeNode treeNode[MAX_TREE_NODE]; //节点数组(所有节点集合)
int nCount; //有效节点个数
};
//////////////////////////////////////////////////////////////////////////
-----第二种
#define MAX_TREE_NODE 100 //最大节点数, 即数组边界
#define MAX_TREE_DEGREE 3 //树的度
//////////////////////////////////////////////////////////////////////////
//实现是通过结构体的数组
//孩子表示法
//优点:求子节点方便
//数据重复
struct ChildTreeNode
{
void *data; //数据
int childIndex[MAX_TREE_DEGREE]; //该节点的子节点(孩子节点)在数组中的索引
//指向子节点的指针变量,无子节点为NULL,有则继续指向下一个新子节点
//ChildTreeNode* pChildNext;
};
struct ChildTree
{
ChildTreeNode treeNode[MAX_TREE_NODE]; //节点数组(所有节点集合)
int nCount; //有效节点个数
};
//////////////////////////////////////////////////////////////////////////
//树的度
//////////////////////////////////////////////////////////////////////////
//实现是通过结构体的数组
//孩子表示法
//优点:求子节点方便
//数据重复
struct ChildTreeNode
{
void *data; //数据
int childIndex[MAX_TREE_DEGREE]; //该节点的子节点(孩子节点)在数组中的索引
//指向子节点的指针变量,无子节点为NULL,有则继续指向下一个新子节点
//ChildTreeNode* pChildNext;
};
struct ChildTree
{
ChildTreeNode treeNode[MAX_TREE_NODE]; //节点数组(所有节点集合)
int nCount; //有效节点个数
};
//////////////////////////////////////////////////////////////////////////
三.双亲孩子表示法
总结:本次通过用数组实现,如下范例
----第一种
#define MAX_TREE_NODE 100 //最大节点数, 即数组边界
#define MAX_TREE_DEGREE 3 //树的度
//////////////////////////////////////////////////////////////////////////
//实现是通过结构体的数组
//双亲孩子表示法
//优点:求父.子节点方便
struct ChildTreeNode
{
void *data; //数据
int parentIndex; //双亲位于数组中的索引号
int childIndex[MAX_TREE_DEGREE]; //该节点的子节点(孩子节点)在数组中的索引
};
struct ChildTree
{
ChildTreeNode treeNode[MAX_TREE_NODE]; //节点数组(所有节点集合)
int nCount; //有效节点个数
};
//////////////////////////////////////////////////////////////////////////
//树的度
//////////////////////////////////////////////////////////////////////////
//实现是通过结构体的数组
//双亲孩子表示法
//优点:求父.子节点方便
struct ChildTreeNode
{
void *data; //数据
int parentIndex; //双亲位于数组中的索引号
int childIndex[MAX_TREE_DEGREE]; //该节点的子节点(孩子节点)在数组中的索引
};
struct ChildTree
{
ChildTreeNode treeNode[MAX_TREE_NODE]; //节点数组(所有节点集合)
int nCount; //有效节点个数
};
//////////////////////////////////////////////////////////////////////////
-----第二种
#define MAX_TREE_NODE 100 //最大节点数, 即数组边界
#define MAX_TREE_DEGREE 3 //树的度
//////////////////////////////////////////////////////////////////////////
//实现是通过结构体的数组
//双亲孩子表示法
//优点:求父.子节点方便
struct ChildTreeNode
{
int childIndex; //子节点在数组中的索引号
ChildTreeNode *pNext; //指向下一个子节点指针
};
struct TreeNode
{
void *data; //数据
int parentIndex; //双亲位于数组中的索引号
ChildTreeNode* pChildNext; //指向子节点的指针变量,无子节点为NULL,有则继续指向下一个新子节点
};
struct ChildTree
{
TreeNode treeNode[MAX_TREE_NODE]; //节点数组(所有节点集合)
int nCount; //有效节点个数
};
//////////////////////////////////////////////////////////////////////////
可以自己组合