扁平化树作为展开链表用于快速二分查找

Flattened Tree as an Unrolled Linked List for fast Binary Search

我有一个树数据结构,我把它变成一个排序的平面列表(一个展开的链表数据结构)。现在我想做一个快速的二进制搜索,我想到的想法是:每个列表元素都存储一个指向另一个元素的指针,该元素是原始树结构中的 MID 子元素。为了快速删除,每个元素也可以指向其 "parent"。

问题:

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

这棵树(写成 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

如果我没理解错的话,你考虑的是 linked list(或者双向链表,如果你还链接到前一个元素)。

关于插入,链表的搜索时间为O(n),插入时间为O(1),树的搜索时间和访问时间为O(n)到O(log n)根据它们的排序方式,我会让你 see for yourself.

最后,如果你使用的是搜索时间为 O(log n) 的树,你最好直接使用它,否则这取决于将你的树变成排序的需要多长时间链表(可能是 O(n))。

此外,作为奖励,读取树的 "mid" 子树的科学术语称为 "in-order traversal",与预序和 post 序遍历相反。