查找AVL树的中位数

时间:2015-02-15 16:54:25

标签: median avl-tree

我搜索了一下,发现了相关帖子:Get median from AVL tree? 但是我对这种反应并不太满意。

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

  • 如果余额系数为0,则返回根
  • 否则继续删除根,直到树完全平衡,并计算刚删除的根的中位数

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

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

1 个答案:

答案 0 :(得分:0)

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

  • 你在这个过程中破坏了你的树(或者为#34;备份"副本占用了两倍的内存)
  • 在最糟糕的情况下,你需要相当多的根删除来获得一个完全平衡的树(我认为在最坏的情况下,它将接近2^(n-1)-1删除... ...而你&#39 ; d仍然需要从中计算中位数。

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

请参阅IVlad的回答here。由于AVL树保证O(log n) 搜索操作,而IVlad的算法本质上是搜索操作,因此您可以找到k - O(log n)时间和O(1)空间中的最小元素(不计算树本身的空间)。

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

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

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