扁平树作为快速二进制搜索的展开链接列表

时间:2017-09-27 07:43:38

标签: linked-list tree binary-search

我有一个树形数据结构,我将其变成一个排序的平面列表(一个展开的链表数据结构)。现在我想进行快速二进制搜索,我想出的想法是:每个列表元素都存储一个指向另一个元素的指针,该元素是原始树结构中的MID子元素。对于快速删除,每个元素也可以指向其“父”。

问题:

  • 这已经是命名数据结构吗?它的“官方”名称是什么?
  • 按键也称为搜索的排序插入,删除和随机访问的时间复杂度O(?)是什么?

[edit]这是这种结构的半图形表示:

这棵树(用JSON表示法编写):

    {
      "abc": {
        "a": 42,
        "b": 43,
        "c": 44
      },
      "d": 45,
      "e": {
        "f": {
          "g": 46,
          "h": 47
        }
      }
    }

被展平为此列表: (“ - > x”表示元素指向索引x处元素的地址) (每个元素存储来自原始树的键和值,如果有的话)

    [0] "abc": nil -> 2
    [1] "a":   42  -> nil
    [2] "b":   43  -> nil
    [3] "c":   44  -> nil
    [4] "d":   45  -> nil
    [5] "e":   nil -> 6
    [6] "f":   nil -> 7
    [7] "g":   46  -> nil
    [8] "h":   47  -> nil

说明:

    [INDEX] "KEY": VALUE -> ADDRESS OF MID CHILD ELEMENT

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你会考虑linked list(或者如果你也链接到前面的元素那么双链表)。

关于插入,链表的搜索时间为O(n),插入时间为O(1),树的搜索时间和访问时间范围从O(n)到O(log n),具体取决于他们如何分类,我会告诉你see for yourself

最后,如果您使用的是具有O(log n)搜索时间的树,则最好直接使用它,否则它取决于将树转换为已排序链表所需的时间(可能是O(n))。

此外,作为奖励,阅读树的“中间”孩子的科学术语称为“有序遍历”,而不是预订和后序遍历。