【问题标题】:Are structs necessary in binary search trees二叉搜索树中是否需要结构
【发布时间】:2010-02-08 05:14:59
【问题描述】:

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

【问题讨论】:

  • 不需要结构体。您可以改用类。在 C++ 中,类默认为私有成员,在您的第一个公共或受保护声明之前的类定义中的所有内容都将是私有的。结构,默认情况下具有公共成员。
  • 必要是什么意思?
  • 不需要结构。可以使用任何数据类型。 BST 需要有指向节点的指针,并且节点需要有内容(或者它们可以是指向数据的指针)。例如,您可以有一个 void 指针数组:void * tree_array[200][3];,其中最后一个维度是 left、data、right 指针。你对structs 有意见吗?

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


【解决方案1】:
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]

我不会再继续这样做了。

一般来说,structs/classes 用于任何类型的链接数据结构。同样通常,类型系统的任何特性都可能被破坏或忽略,您可以以非常痛苦的方式在 ints 的一个数组中执行所有操作(堆分配等)。

【讨论】:

  • 目前最佳答案:同时显示两个答案。理论上没有,实际上是的。
  • 第二个维度可能会使这更容易,其中索引值可以是左侧的 0、数据的 1 和右侧的 2。
  • @Thomas: 相对来说;v)
【解决方案2】:

不,它可能是一堂课。它不能是原语,因为它需要存储一个值并指向孩子。

好吧,我应该说你也可以将你的 BST 表示为一个数组,其中位置 i 的节点的左右子节点分别位于位置 2 * i + 12 * i + 2。但是,您将不得不担心调整大小,并且您需要一个特殊的值来表示 null,并且删除操作变得相当复杂。除了学术练习,我不推荐这种方法。

【讨论】:

  • 糟糕,我没有看到你的答案。不过,我认为您的意思是 3 * i + 2。
  • 3 似乎更好......这种混乱是一个很好的论据,为什么应该使用结构。
  • 这基本上是 Robert W. Floyd 的 Treesort 3 排序算法(来自 ACM 的算法 245)背后的技术。它是在 Quicksort 大约两年后出版的。它具有 O(N log N) 的性能,但被呈现为非递归算法。有关血腥细节,请参见 portal.acm.org/…,在 Algol 中。 (您需要订阅 ACM 数字图书馆才能下载 PDF。恕我直言,物有所值!未付费插件。)
  • 哦,我现在明白了。这更像是一个由内而外的堆。对于黑盒算法,它可能类似于树,但需要重建而不是重新链接的东西不能正确地称为树。
  • 当然可以称为树。树没有任何特定的实现 - 它只是一个有向无环图。
【解决方案3】:

这不是强制性的。
但是由于节点包含的数据与两个链接一起形成一个逻辑实体,它们通常放在一个结构中。这样可以更轻松地编写将节点作为参数或返回节点的函数。

【讨论】:

    【解决方案4】:

    不,严格来说不是。在 FORTRAN 时代,人们使用并行数组或二维数组。

    Tony Hoare 在 Dahl、Dijkstra 和 Hoare 撰写的“结构化编程”部分讨论了数据结构化和记录类型。

    【讨论】:

      【解决方案5】:

      如果你的有效载荷允许一个标记值,你可以做比并行数组更简单的事情:你可以使用隐式树(也就是说,根本不用担心链接)。

      payload_type a[tree_size];
      

      只是一个长的扁平数组,只包含有效载荷值,数组中的位置编码链接结构:

      • a[0] 是根
      • a[1] 是根->左
      • a[2] 是root->正确的
      • a[3] 是根->左->左
      • a[4] 是根->左->右
      • ...

      对于位置i处的节点,左边去2*i+1,右边去2*i+2

      您将其初始化为所有标记值,然后开始添加内容...

      【讨论】:

        猜你喜欢
        • 2021-02-07
        • 2017-03-15
        • 2020-08-03
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        相关资源
        最近更新 更多