【发布时间】:2015-02-15 16:54:24
【问题描述】:
我搜索了一下,找到了一个相关的帖子:Get median from AVL tree? 但我对反应不太满意。
我对解决这个问题的想法:
- 如果余额因子为0,则返回root
- 否则继续移除根直到树完全平衡,然后计算刚刚移除的根的中位数
假设 AVL 树将保持平衡(根据定义?) 我已经看到一些建议按顺序遍历并找到中位数的答案,但我认为这需要更多的空间和时间。
有人可以确认或更正我的想法吗?谢谢!
【问题讨论】:
我搜索了一下,找到了一个相关的帖子:Get median from AVL tree? 但我对反应不太满意。
我对解决这个问题的想法:
假设 AVL 树将保持平衡(根据定义?) 我已经看到一些建议按顺序遍历并找到中位数的答案,但我认为这需要更多的空间和时间。
有人可以确认或更正我的想法吗?谢谢!
【问题讨论】:
您建议的方法存在两个问题:
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 元素并返回它们的平均值此外,如果无法更改树(左/右元素计数),请参阅您链接到的答案的第二部分。
【讨论】: