二叉搜索树中是否需要结构

时间:2010-02-08 05:14:59

标签: c++ struct binary-tree binary-search

我查看了BST的一些代码,我可以看到每个节点都是一个结构。这有必要吗?

5 个答案:

答案 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 + 12 * 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值,然后开始添加内容......