我搜索了一下,发现了相关帖子:Get median from AVL tree? 但是我对这种反应并不太满意。
我对解决这个问题的看法:
假设AVL树将保持平衡(根据定义?) 我已经看到一些答案表明有序遍历并找到中位数,但我认为这需要更多的空间和时间。
有人可以确认或更正我的想法吗?谢谢!
答案 0 :(得分:0)
您建议的方法存在两个问题:
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
元素并返回其平均值此外,如果无法更改树(左/右元素计数),请参阅您链接到的答案的第二部分。