上周我参加了考试,我遇到了以下问题:
描述如何修改二进制搜索树以计算 T中的条目数,其中密钥k为O(h)时间。这个算法应该返回一个 整数,而不是列表。
然后在考试之后答案出版了,如下:
解决方案:通过向每个节点添加内部节点数来修改树 以该节点为根的子树。在插入,删除节点时重新计算这些 并可能进行重组。这需要以下算法:
但这似乎很令人困惑。我的问题是我用红色围绕它们的那些部分的作用是什么?
答案 0 :(得分:2)
假设您找到了值为node
的节点k
,这就是您要搜索的内容。现在,假设node.left.value = k
。您对子树node.left.right
中的所有内容了解多少?每个值必须小于或等于k
(因为它位于node
的左侧),但也大于或等于k
(因为它位于{{1}的右侧}})。因此,该子树中的所有值都等于node.left
。作为优化,该算法避免在该情况下递归地下降到该子树,而是仅自动将该子树中的所有内容添加到总数中。这是获得O(h)运行时所必需的;如果您探索了这些树中的所有节点,如果树中的所有n个值都等于k
,则运行时可能为Ω(n)。
在k
。
node.right.left
希望这有帮助!