BST有重复
我知道, BST
不允许重复。 例如,如果我有一个单词“RABSAB”。
上述字符串的二进制搜索树是:
R /\ AS \ B
如果我们想在树中包含重复项,该怎么办? 树怎么会改变? 我在接受采访时被问到这个问题。
他们让我画画:
- 二叉树
- 不平衡的二进制搜索树
- 没有重复的二叉搜索树
- 带有重复项的二叉搜索树
任何帮助表示赞赏!
PS:通过绘制相关树帮助我
在没有重复的二进制搜索树中插入的规则是:
- 如果元素小于root,则向左移动
- 如果元素大于root,则向右移动。
要允许重复条目,您必须修改规则,如下:
- 如果元素小于或等于root,则向左移动
- 如果元素大于root,则向右移动。
要么
- 如果元素小于root,则向左移动
- 如果元素大于或等于root,则向右移动。
要么
- 如果元素小于root,则向左移动
- 如果元素大于root,则向右移动。
- 如果元素等于根,则增加计数。
所以您的BST
单词“RABSAB” ,带有重复项可以像:
R / \ AS / \ AB / B
要么,
R / \ AS \ A \ B \ B
要么
R(1) / \ / \ A(2) S(1) \ \ B(2)
在前两种情况下,插入和搜索都变得有点复杂! 你会在这里找到很多解释!
第三种情况更容易维护。
所有这些都成功地用于允许重复,现在选择是你的!
一种选择是修改树,以便一个分支将包含重复项,例如让左分支保存小于或等于父项的节点,或者使右分支保存大于或等于父项的节点
另一种选择是将所有重复项存储在节点中,而不是
class Node { Node left, right; Object data; }
你会反而拥有
class Node { Node left, right; List data; }
要么
class Node { Node left, right; Object data; int count; }
在正常的BST插入和搜索中,两者都基于小于(>)和大于(<)规则发生。
您可以尝试插入小于等于(> =)或大于等于(<=)并尝试使用相同的规则进行搜索。
或者,您可以在每个节点中包含一个数组以容纳重复元素。
对于输入RABPAB
,您可以使用LIST创建BST
来存储所有等值键。 使用能够存储它的数据结构将所有等值键放置在同一级别中。
BST看起来像这样,
R / \ A--AP \ B--B
存储整数值的BST的Java代码可能是这样的,
class Node { Node left, right; int data[maxvalue]; }
这里maxvalue
是最大可能的等值键。