树和森林的实现——树的四种存储结构、树、森林和二叉树的转换

树和森林6.7 树和森林的实现6.7.1 树的存储结构1.双亲表示法2.孩子表示法3.双亲-孩子表示法4. 孩子-兄弟表示法总结6.7.2 树、森林和二叉树的转换1. 树转化为二叉树2. 森林转化为二叉树3. 二叉树转化为森林6.7.3 树的遍历小结6.7.4 森林的遍历小结6.7 树和森林的实现6.7.1 树的存储结构1.双亲表示法由树的定义可以知道,在树中除根结点外的每个结点都有唯一的一个双亲结点,因此,可以考虑用一组连续的存储空间存储树中的每一个结点,数组中的一个元素表示为树中的一个结点。
摘要由CSDN通过智能技术生成

6.7 树和森林的实现

6.7.1 树的存储结构

在这里插入图片描述

1.双亲表示法

  1. 由树的定义可以知道,在树中除根结点外的每个结点都有唯一的一个双亲结点,因此,可以考虑用一组连续的存储空间存储树中的每一个结点,数组中的一个元素表示为树中的一个结点。在数组元素中除包括结点本身的数据信息外,还保存该结点的双亲结点在数组中的序号(根结点的双亲域赋予-1)树的这种存储方法称为双亲表示法。
  2. 每一个数组元素有两个域:data 和 parent, data域存储结点的数据信息;parent 域存储结点的双亲在数组中的序号。
typedef struct  Node{
   
	char data;
	int parent;
}PTNode;
typedef struct{
   
	PTNode nodes[100];
	int n;
}PTree;

在这里插入图片描述
3. 树的双亲表示法【优点】对于实现求双亲操作很方便,时间复杂度为O(1),但【缺点】①对于求某结点的孩子结点的操作,则需要询整个数组。②另外,这种存储方式不能直接反映各兄弟结点之间的关系,所以实现求兄弟的操作也比较困难(若要找结点的孩子或者兄弟,要遍历整个树)。
4. 实际上,如果需要实现这些操作,只需将上述存储结构稍加改进:给每个数组元素增加两个域,一个域存储该数组元素所表示的结点的第一个孩子结点在数组中的序号,另一个域存储该结点的右兄弟结点在数组中的序号。在这种改进的存储结构下,就能够较方便地实现树的各种基本操作。
(1)改进一:方便获取孩子结点

/*树的双亲表示法结点结构定义*/
#define MAX_TREE_SIZE 100

typedef int TElemType;

typedef struct PTNode    //结点结构
{
   
    TElemType data;    //结点数据
    int parent;        //双亲位置
    int child1;        //孩子结点1
    int child2;        //孩子结点2
    int child3;        //孩子结点3
}PTNode;

typedef struct //树结构
{
   
    PTNode nodes[MAX_TREE_SIZE];    //结点数组
    int r, n;    //r是根位置,n是结点数
}PTree;

在这里插入图片描述

  • 【缺点】消耗了大量的空间,是不必要的
  • 我们尽可能使用较小的空间,所以我们一般只添加一个长子域(最左边孩子的域),可以获取到有0个或1个孩子结点,甚至两个子树都可以获取,但是对于较多的孩子我们若是非得使用顺序存储,就得使用上面方法。
/*树的双亲表示法结点结构定义*/
#def
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值