普通树在线性内存中存储表示方法

想把树类型结构的非线性数据存储到计算机的线性存储,就发明了以下几种表示方法:

一.双亲表示法

    总结:本次通过用数组实现,如下范例

    优点:求父节点方便

 

/************************************************************************/
/* 双亲表示法															*/
/************************************************************************/
//实现是通过结构体的数组
//优点:求根节点方便
#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;							//有效节点个数
};
//////////////////////////////////////////////////////////////////////////


 

 

 

可以自己组合

 

 

 

 

 

 

 

 

 

 

posted @ 2016-12-13 00:46  jadeshu  阅读(201)  评论(0编辑  收藏  举报