【问题标题】:Find Median of AVL tree查找 AVL 树的中位数
【发布时间】:2015-02-15 16:54:24
【问题描述】:

我搜索了一下,找到了一个相关的帖子:Get median from AVL tree? 但我对反应不太满意。

我对解决这个问题的想法:

  • 如果余额因子为0,则返回root
  • 否则继续移除根直到树完全平衡,然后计算刚刚移除的根的中位数

假设 AVL 树将保持平衡(根据定义?) 我已经看到一些建议按顺序遍历并找到中位数的答案,但我认为这需要更多的空间和时间。

有人可以确认或更正我的想法吗?谢谢!

【问题讨论】:

    标签: median avl-tree


    【解决方案1】:

    您建议的方法存在两个问题:

    • 您在此过程中破坏了您的树(或为“备份”副本占用了两倍的内存)
    • 在最坏的情况下,您需要大量的根删除才能获得完全平衡的树(我认为在最坏的情况下,它会接近 2^(n-1)-1 删除)...而且您仍然需要从中计算中位数。

    您的链接问题中的答案是正确且最佳的。解决这个问题的常用方法是构造一个Order statistic tree(通过保存每个节点的左右子树的元素数量)。请注意,如果发生 AVL 树的旋转,您必须相应地补偿这些数字。

    请参阅 IVlad 的回答 here。由于 AVL 树保证了O(log n) Search 操作并且IVlad 的算法本质上是一个Search 操作,因此您可以在O(log n) 时间内找到k-th 最小的元素和O(1) 空间(不包括树本身的空间)。

    假设您的树从 0 开始索引并且具有 n 元素,请按以下方式找到中位数:

    • 如果n 是奇数:找到(n-1)/2-th 元素并返回它
    • 如果n 是偶数:找到n/2-th 和(n/2)-1 元素并返回它们的平均值

    此外,如果无法更改树(左/右元素计数),请参阅您链接到的答案的第二部分。

    【讨论】:

    • 谢谢,有道理!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多