在 log(n) 中搜索 AVL 树?

问题描述

这个问题取自一个准备面试的大问题(成功解决了其余部分)

问题:建议使用 DataStructure 处理盒子,其中盒子具有:特殊 ID、重量和尺寸。

我想将这些框保存在 AVL 树中,并能够解决以下问题:

从所有最大为 v 的盒子中(换句话说:size

如何在 log(n) 中执行此操作,其中 n 是已保存框的总数?

我知道该解决方案会在每个节点中保存一些额外的数据,但我不确定哪些数据会有所帮助(无需解释如何修复轮换数据等)

保存在每个节点中的额外数据示例:右子树中最重框的 ID。

解决方法

听起来您已经走上了正确的轨道:每个节点都存储其最重的后代。唯一缺少的部分是提出一组 log(n) 节点,使得目标节点是其中一个节点的后代。

换句话说,您需要确定 AVL 树的所有子树,这些子树完全由大小小于(即在您的 size=v 节点的左侧)的节点组成。

那些是那些?嗯,一方面,当然是 size=v 节点的左子节点。然后,从该节点到根节点。作为右孩子的 size=v 节点的每个祖先,考虑它的左兄弟(以及节点本身)。沿途检查其根的子树集将是 size=v 节点左侧的所有节点。

作为一种简化,您可以将上限大小搜索与搜索目标节点结合起来。基本上,您遍历具有最高最大权重后代的子项,但不允许遍历会违反大小约束的子项。

max = null
x = root
while x is not null:
  if x.size <= v:
    if x.weight > max.weight:
      max = x
    x = x.left or x.right,depending on which has a larger maxWeightDescendant
  else:
    x = x.left