BST有重复

时间:2013-05-24 04:53:37

标签: java binary-tree binary-search-tree

我知道,BST不允许重复。例如,如果我有一个单词“RABSAB”。

上述字符串的二进制搜索树是:

    R
    /\
   A  S
    \
     B

如果我们想在树中包含重复项,该怎么办?树怎么会改变?我在接受采访时被问到这个问题。

他们让我画画:

  1. 二叉树
  2. 不平衡的二进制搜索树
  3. 没有重复的二进制搜索树
  4. 带有重复项的二进制搜索树
  5. 感谢任何帮助!

    PS:通过绘制相关的树来帮助我

4 个答案:

答案 0 :(得分:19)

在不重复的二进制搜索树中插入的规则是:

  1. 如果元素小于root
  2. ,则向左移动
  3. 如果元素大于root,则向右移动。
  4. 要允许重复输入,您必须修改规则,如下所示:

    1. 如果元素小于或等于root
    2. ,则向左移动
    3. 如果元素大于root,则向右移动。
      1. 如果元素小于root
      2. ,则向左移动
      3. 如果元素大于或等于root,则向右移动。
        1. 如果元素小于root
        2. ,则向左移动
        3. 如果元素大于root,则向右移动。
        4. 如果元素等于根,则增加计数。
        5. 所以你的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是最大可能的等值键。