【发布时间】:2016-01-23 22:52:39
【问题描述】:
我们得到一个带有n节点的树,其形式是指向其根节点的指针,其中每个节点都包含一个指向其父节点、左子节点和右子节点的指针,以及一个整数键。对于每个节点v,我想添加附加字段v.bigger,其中应包含键大于v.key 的节点数,这些节点位于以v 为根的子树中。将这样的字段添加到树的所有节点总共需要 O(n log n) 时间。
我正在寻找任何可以让我解决此问题的提示。我尝试了几种启发式方法-例如,在考虑以自下而上的方式解决此问题时,对于固定节点 v、v.left 和 v.right 可以为 v 提供某种集合(平衡 BST?)操作bigger(x),对于给定的x,它在对数时间内返回大于x 的元素数量。问题是,我们需要在O(log n) 中合并这些集合,所以这似乎是不可行的,因为我不知道任何支持快速合并的有序集合,如数据结构。
我还考虑了自上而下的方法 - 当且仅当 u 位于到根和 u<v 的简单路径上时,节点 v 为某些节点 u 添加一个 u.bigger。所以v 可以以某种方式更新所有这些u,但我想不出任何合理的方式来做到这一点......
那么,思考这个问题的正确方法是什么?
【问题讨论】:
标签: algorithm data-structures tree