我查看了BST的一些代码,我可以看到每个节点都是一个结构。这有必要吗?
答案 0 :(得分:7)
int flat_tree[ 1000 ][ 3 ];
// for each tree node, value is stored in element [id][0]
// id of left_child stored in element [id][1]
// id of right_child stored in element [id][2]
...
我不会再这么做了。
一般来说,struct
s / class
es用于任何类型的链接数据结构。通常,类型系统的任何功能都可能被忽略或忽略,您可以非常痛苦地在一个int
数组中执行所有操作(堆分配等)。
答案 1 :(得分:4)
不,它可能是一个班级。它不能是原始的,因为它需要存储一个值并指向孩子。
嗯,我应该说你也可以将你的BST表示为一个数组,位置i
的节点的左右子节点位于2 * i + 1
和2 * i + 2
的位置,分别。但是,您将不得不担心调整大小,并且您需要一个特殊值来表示null,并且删除操作变得非常复杂。除了学术练习外,我不建议采用这种方法。
答案 2 :(得分:4)
它不是强制性的。
但是,由于节点包含的数据与两个链接一起形成逻辑实体,因此它们通常放在一个结构中。因此,对以节点作为参数或返回节点的函数进行编码变得更加容易。
答案 3 :(得分:1)
不,严格来说。在FORTRAN时代,人们使用并行数组或二维数组。
Tony Hoare在Dahl,Dijkstra和Hoare的“结构化编程”部分讨论了数据结构和记录类型。
答案 4 :(得分:0)
如果您的有效负载允许一个sentinal值,您可以比并行数组更简单:您可以使用隐式树(也就是说,根本不需要使用链接)。
payload_type a[tree_size];
只是一个长平面数组,只包含有效负载值,数组中的位置编码链接结构:
a[0]
是root a[1]
是root-> left a[2]
是root-> right a[3]
是root-> left-> left a[4]
是root-> left-> right 对于位置i的节点,左转2 * i + 1,右转2 * i + 2
您将其初始化为所有sentinal值,然后开始添加内容......