【发布时间】:2012-09-02 01:50:00
【问题描述】:
我有一个数据结构作业,除了常规的 AVL 树函数之外,我还必须添加一个函数,该函数返回 AVL 树中任意两个数字之间的最小间隙(AVL 中的节点实际上代表数字。)
假设我们在 AVL 树中有数字(作为节点)1 5 12 20 23 21,该函数应该返回任意两个数字之间的最小间隙。在这种情况下,它应该返回“1”,即 |20-21|或 |21-20|。
应该在 O(1) 内完成。
想了很多,我知道有一个窍门,但就是找不到,我花了好几个小时来解决这个问题。
还有一个任务是找到最大间隙,这很容易,它是最小和最大数之间的差。
【问题讨论】:
-
为什么最小间隙不是|21 - 20| = 1 ?
-
哦,非常抱歉!应该是 |21-20|或 |20-21| = 1,函数应该返回 1!非常抱歉这个错误!
-
当我用这些数字绘制平衡二叉树时,20 是根节点,21 是根的右子树中最深和最左边的叶节点。我有一种感觉,你必须区分根和很深的叶子。我必须再次阅读 AVL 树,看看您是否可以“滥用”这些树的这一特性。
-
我很确定有这种技巧。令我震惊的是我应该在 O(1) 中做到这一点——我想不出任何算法可以做到这一点!此外我应该提到,AVL 树的所有基本功能,如 Init、Search、Insert、Delete 仍然应该是 O(log(n)) - 所以我确定我不应该在基本功能中添加任何东西!这个问题让我摸不着头脑!
-
看看这个链接:stackoverflow.com/questions/1484473/… 似乎确实存在该算法,但需要 O(n) 中的预处理
标签: search data-structures tree avl-tree