树1——树的几种存储结构

零、说明

  1. 只包括初始化代码,其他功能有待后续再写
  2. 不知道正不正确,不过没有error和warning

一、双亲表示法(Parent)

每个树的节点存储它的双亲节点的下标,这样就能一层一层上溯。
下列是Pro版,还加上了firstchild和rigntsibling,可以更轻易地得到某个想要的节点。不过原始的双亲表示法可以只有int parent

  1. 纯用顺序结构,叠了两层结构体
typedef struct 
{
	int data;
	int parent,firstchild,rightsibling;
}PTreenode;
typedef struct 
{
	PTreenode data[MAXSIZE];
	int root,num;
}PTree;
void Initial_Parent(PTree *T)
{
	T->root=0;
	T->num=0;
	T->data[T->root].parent=-1;//根节点的双亲设为-1,表示没有双亲 
	T->data[T->root].firstchild=-1;//没有第一个孩子
	T->data[T->root].rightsibling=-1;//没有右兄弟
	for(int i=0;i<MAXSIZE;i++)
	{
		T->data[i].data=-1;//还没有任何数据 
	} 
}

二、孩子表示法(Child)

大致结构如下,用一个接一个的办法存储每个节点的所有孩子。注意:每个节点连着的是另一种结构体,可以想象为某个节点的替身,真正的节点在结构体数组中,这里一连串只是表示某个节点的孩子有哪些而已
在这里插入图片描述

  1. 混用顺序存储和链式存储,三层结构体叠用
typedef struct CTreechild
{
	int child;
	struct CTreechild *next;
}*CTreeptr;
typedef struct
{
	 int data;
	 CTreeptr firstchild;
}CTreenode;
typedef struct 
{
	CTreenode data[MAXSIZE];
	int root,num;
}CTree;
//可以组合成双亲孩子表示法:在CTreenode中加一个变量int parent,这样可以轻松遍历到树中任何一个元素 
void Initial_Child(CTree *T)
{
	T->root=0;
	T->num=0;
	for(int i=0;i<MAXSIZE;i++)
	{
		T->data[i].data=-1;
		T->data[i].firstchild=NULL;
	}
}

三、孩子兄弟表示法(ChildSibling)

知道每个节点的孩子和右兄弟,由根节点也能到达每一个节点

  1. 纯粹用指针结构
typedef struct CSTreenode
{
	int data;
	struct CSTreenode *firstchild,*rightsibling;
}CSTreenode,*CSTree;
void Initial_ChildSibling(CSTree T)
{
	T->data=-1;
	T->firstchild=NULL;
	T->rightsibling=NULL;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值