树的存储结构1

本文探讨了树的存储结构问题,重点介绍了双亲表示法。在这种方法中,每个节点包含指向其父节点的引用,允许快速访问父节点,但查找子节点需要遍历。文章鼓励读者思考和设计更灵活的存储结构,强调结构设计应考虑运算的便捷性和效率。
摘要由CSDN通过智能技术生成

树的存储结构

 

不好意思哈,这节课又需要大家搞脑子了。对于知识,你理解的越多,需要记住的就越少!

上节课我们简单的介绍了树结构的强大,这节课我们来关心一下如何在内存中安排树这种结构的存放。

 

说到存储结构,就会想到我们前面章节讲过的顺序存储和链式存储两种基本结构。

对于线性表来说,很直观就可以理解,但对于树这种一对多的结构,我们应该怎么办呢?

 

要存储树,简单的顺序存储结构和链式存储结构是不能滴!不过如果充分利用它们各自的特点,完全可以间接地来实现。

大家先思考下,如果你是总工程师,让你来设计和规划,你有多少种方法可以实现对树结构的存放?

 

当然你要考虑到双亲、孩子、兄弟之间的关系。

小甲鱼这里要介绍三种不同的表示法:双亲表示法、孩子表示法、孩子兄弟表示法。

 

双亲表示法

 

双亲表示法,言外之意就是以双亲作为索引的关键词的一种存储方式。

我们假设以一组连续空间存储树的结点,同时在每个结点中,附设一个指示其双亲结点在数组中位置的元素。

 

也就是说,每个结点除了知道自己是谁之外,还知道它的粑粑妈妈在哪里。

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

typedef int ElemType;

typedef struct PTNode
{
	ElemType data;	// 结点数据
	int parent;		// 双亲位置
}PTNode;

typedef struct
{
	PTNode nodes[MAX_TREE_SIZE];
	int r;			// 根的位置
	int n;			// 结点数目
}PTree;


 

 

这样的存储结构,我们可以根据某结点的parent指针找到它的双亲结点,所用的时间复杂度是O(1),索引到parent的值为-1时,表示找到了树结点的根。

可是,如果我们要知道某结点的孩子是什么?那么不好意思,请遍历整个树结构。

 

这真是麻烦,能不能改进一下呢?

鱼油们怎么看?

电视机前的小盆友们怎么看?

 

当然可以,我们只需要稍微改变一下结构即可:

 

那现在我们又比较关心它们兄弟之间的关系呢?

 

存储结构的设计是一个非常灵活的过程,只要你愿意,你可以设计出任何你想要的奇葩!

一个存储结构设计得是否合理,取决于基于该存储结构的运算是否适合、是否方便,时间复杂度好不好等等。

 

不要拘泥于你所学过的有限的数据类型,要把思维放开些,放开些,放开些!

当你的思维放开了,世界就变小了!

当你的思维放开了,知识就变少了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值