如何在二叉搜索树中允许重复项?

How to allow duplicates in a binary search tree?

我不是在寻找代码,只是在寻找概念。

根据加州大学伯克利分校的 jonathan Shewchuck 教授(在线 CS61b 课程),如果您找到完全匹配的内容,则可以将新条目插入左侧 child。

假设您总是选择完全匹配的左侧节点并在那里插入新条目,如果您找到的完全匹配已经有一个左节点 child 会怎样?您是否分离它并强制在其位置创建一个新条目并重新连接旧的左 child 作为这个新节点的 child?

如果完全匹配已经有左边 child,这本身就是完全匹配怎么办?如果允许重复,代码会不会变得太复杂?

在附加节点之前,您需要尽可能地向左移动。遵循新节点到左子树的常规插入逻辑。例如,如果您要插入

5, 3, 7, 2, 3, 8, 7, 2, 5

生成的树看起来像这样:

                      5
                    /   \
                   3     7
                  / \   / \
                 2   5 7   8
                / \
               2   3

请注意 3s 和 5s 在这棵树中是如何不在一起的,因为第一个 3 在我们插入时已经有左 child重复,5.

也是

当然,这并不理想,因为搜索并没有在找到所需元素时结束。更好的方法是 augment 树结构,方法是在树中放置每个节点的重复计数,或者如果树用于关联,则将数据列表附加到每个单独的节点存储。

                     5(2)
                    /    \
                  3(2)   7(2)
                 /         \
               2(2)        7(1)