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