二叉搜索树中是否需要结构体
-
19-09-2019 - |
题
我查看了 BST 的一些代码,可以看到每个节点都是一个结构体。有这个必要吗?
解决方案
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
s的一个阵列的一切(堆分配等)。
其他提示
没有,它可能是一个类。它不能是一个原始的,因为它需要存储一个值,并且还指向孩子。
好了,我应该说,你也可以代表你的BST作为一个数组,其中在位置i
节点的左,右孩子都在位置2 * i + 1
和2 * i + 2
,分别。但是,那么你就不必担心调整,你需要一个特殊的值来表示空和删除操作变得相当复杂。我不推荐这种方法,因为不是一个学术活动以外的任何其他。
它不是强制性的。
但是,由于节点包含的数据与两个链接一起形成一个逻辑实体,因此它们通常放在一个结构中。这样就可以更轻松地编写以节点作为参数或返回节点的函数。
没有,不是严格意义。在FORTRAN日子里,人们使用的平行阵列,或者二维阵列。
“结构化编程”,由达尔,Dijkstra算法和霍尔的东尼·霍尔的部分,谈到数据结构和记录类型。
如果您的有效负载允许一个哨兵值,您可以做比并行数组更简单的事情:您可以使用隐式树(即根本不用担心链接)。
payload_type a[tree_size];
只是一个仅包含有效负载值的长平面数组,其位置在数组编码中用于链接结构:
a[0]
是根a[1]
是根->左a[2]
是 root->righta[3]
是根->左->左a[4]
是根->左->右- ...
对于位置 i 的节点,左侧转到 2*i+1,右侧转到 2*i+2
您将其初始化为所有哨兵值,然后开始添加内容......
不隶属于 StackOverflow