【问题标题】:Get Breadth First (Level) Order Without Constructing Red-Black Tree在不构造红黑树的情况下获得广度优先(级别)顺序
【发布时间】:2021-07-10 03:27:07
【问题描述】:

我有一个长度为n 的有序数组,其中包含从1n 的连续整数元素。在为这个数组构造完红黑树之后,我可以使用标准的广度优先搜索方法按级别顺序遍历这棵树。

我的问题是,给定任意一个n <= 100000000(对应一个从1n的连续整数元素的有序数组),是否可以绕过树的构造,直接返回层级顺序?

【问题讨论】:

  • 该数据可能的红背树不是唯一的:可能有很多这样的树,因此级别顺序不是唯一定义的。
  • 也许我需要明确说明这一点,但我只对构建平衡树的级别顺序感兴趣。所以第一层是数组的中间元素,第二层是剩余数组左半边的中间元素,然后是右半边的中间元素,依此类推。如果我们需要找到具有偶数个元素的数组的中间,那么您将选择中心左侧的第一个元素。
  • 对于相同的输入仍然可以有不同的平衡树,因此级别会有所不同。例如,如果 n=4,则级别顺序可以是以下任何一个:[2][1,3][4] 或 [2][1,4][3] 或 [3][2,4][ 1] 或 [3][1,4][2]
  • 鉴于偶数的规则,你的意思是你只考虑平衡树,其中没有子树是左重的,即对于 n=4 你会想要 [2][1,3][ 4]?
  • 是的,对于n=4,我希望电平顺序产生[2][1, 3][4],不过,我只想返回一个带有[2, 1, 3, 4] 的平面数组。对于n=10,我希望水平顺序在展平时为[5][2, 8][1, 3, 6, 9],[4, 7, 10][5, 2, 8, 1, 3, 6, 9, 4, 7, 10]

标签: algorithm binary-search-tree breadth-first-search


【解决方案1】:

如果你不介意额外的空间,你可以这样做。

def level_order(n):
    queue = [(1, n)]
    i = 0
    while i < len(queue):
        a, b = queue[i]
        i += 1
        if a > b:
            continue
        m = (a + b) // 2
        yield m
        queue.append((a, m - 1))
        queue.append((m + 1, b))


print(list(level_order(13)))

【讨论】:

  • 感谢您的建议。虽然这适用于小型 n,但对于 n = 100000000,它似乎表现不佳(在空间和时间上)。
  • @slaw 它在空间和时间上都是渐近最优的,但不是额外的空间。你到底想做什么?
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 2012-02-04
  • 2011-02-04
  • 2022-01-20
  • 1970-01-01
  • 2013-03-17
  • 2011-11-19
  • 2012-01-10
相关资源
最近更新 更多