【发布时间】:2014-09-19 20:11:53
【问题描述】:
给定一个 BST(可能是平衡的,也可能不是平衡的),如何随机均匀地返回“任何”节点?一个约束是您不能使用外部索引数据结构。您必须以这样一种方式遍历树,即每个节点都有相同的被访问机会。
这个问题让我困惑了好一阵子。如果我们确实可以使用外部哈希表/指针,我们可以对它们进行随机化并返回相应的节点。但是,我的同事提出了这个问题的一个相当复杂的变体,其中不能使用额外的数据结构。
- 具有 50-50 机会进行 L/R 的简单随机游走不起作用,因为返回靠近树底部的节点的概率要小得多(概率复合)
- 即使随机生成深度
d并遍历最多d节点以返回节点(或者如果它是叶节点则停止)也不会生成均匀分布。
更新:您也不能进行中序遍历并将结果存储在数组中。
如何实现这样的遍历?
【问题讨论】:
-
你能不能只生成一个介于 0 和树中节点数之间的随机数,然后按顺序遍历树,这样一旦你从一个节点移动到另一个“随机数”数量有时,您会停在那个节点并返回?这似乎太简单了,所以也许这不是你要找的:/
-
没有建议将任何内容存储在数组中
-
如果一个有序的工作是不允许的,那么这个问题是可笑的
-
是的,在一个普通的旧二叉搜索树中均匀采样而不访问每个节点是完全不可能的。
-
@DavidEisenstat:这可能不是该禁令中“和”的意思。无论如何,显然您必须访问每个节点(除非您事先知道有多少个节点),但您不必按顺序访问它们。
标签: algorithm binary-search-tree probability traversal