【发布时间】:2019-01-17 16:11:09
【问题描述】:
当允许重复时,BST 节点通常具有以下属性: 左
left
【问题讨论】:
标签: algorithm data-structures binary-search-tree
当允许重复时,BST 节点通常具有以下属性: 左
left
【问题讨论】:
标签: algorithm data-structures binary-search-tree
因为您需要保持O(log n) 的复杂性进行搜索。假设您正在搜索一个节点,那么您必须在左右子树中检查它以检查它的存在。但是,正确的条件会强制执行 Node 仅存在于其中一个子树中的约束。
考虑BST节点包含Integer和String的场景,构建BST的关键是Integer。
如果您需要整数 a 的所有字符串,则需要检查两个子树,如果您根据实现它,这将导致 O(n) 而不是 O(log n) 的时间复杂度更差到正确的状态。
【讨论】:
如果 left
【讨论】:
你的前提不正确。在允许重复的 BST 中,它总是 left 。选择插入新节点的位置的代码只会选择一侧或另一侧,但这不是关于节点必须如何链接的规则,它不是将被维护的不变量。
这是因为,对于具有重复值的树,左或右分支仅包含严格较大的元素的条件与平衡操作不兼容。试试这个:将相同值的 20 个副本链接到树中。如果您只能在左侧或右侧链接相等的值,那么您必须创建一个单链表。您的树将有 20 层深且完全不平衡。
考虑树中重复值的方法是,树中实际上没有任何重复值 :-) BST 定义了总排序,而有效的重新平衡操作(如旋转)会保留此总排序。
在树中插入重复项时,会将其放在现有匹配项的左侧或右侧。如果你把它放在左边,那么它会根据树的顺序变小,并且在任何重新平衡后它总是会变小。如果你把它放在右边,那么它会更大,并且会根据树的顺序保持更大。
如果您考虑一下,它必须是这样的,因为平衡操作和中序遍历甚至不查看节点中的值。它们链接在一起的方式决定了排序,排序不会随着树的重新平衡而改变,并且排序是完全的——在中序遍历中,每个节点都在每个其他节点之前或之后。
【讨论】: