处理bst中的重复项

时间:2009-10-10 07:51:50

标签: java duplicates binary-search-tree

我的bst必须能够处理重复的条目。有没有人有任何策略如何解决这个问题,不需要过多的代码? 我想到一直在向右边添加重复项,但那会破坏bst顺序。例如,当副本有两个孩子,而这两个孩子又有两个孩子时会发生什么?插入副本很容易,但是它替换的节点要做什么?

3 个答案:

答案 0 :(得分:3)

只要它不是自平衡BST,我就没有看到在节点左侧或右侧放置相等节点的问题。

编辑(在simonn的评论之后):

如果有问题的“重复节点”已经​​有2个孩子,那么只需在左边插入“新的重复节点”,让“旧的重复节点”的左子节成为“新的重复节点”的左子节点”

让我用一个例子来澄清。插入副本之前的树:

    4'
   / \
  2   5
 / \
1   3

现在插入了元素4''

      4'
     / \
    4'' 5
   /
  2   
 / \
1   3

只要树不能自我平衡,你应该没问题。

答案 1 :(得分:2)

您可以将二叉搜索树的节点变为链接列表。

class Data implements Comparable<Data>
{
   // These are the data elements in your binary search tree
}

class TreeNode
{
  TreeNode left; // elements less than current node, or null
  TreeNode right; // elements greater than current node, or null
  List<Data> items = new LinkedList<Data>();    
}

此处,treeNode.items始终为非空列表,item1.compareTo(item2) == 0中的每个item1item2都会treeNode.items

要插入重复元素,您会找到相关的TreeNode对象,并向items添加新项目。

查找元素的逻辑与之前几乎相同,只是一旦找到相关的TreeNode对象,就必须走链表。

答案 2 :(得分:0)

我想知道你是否真的需要将重复的条目存储为单独的节点?向您的Node添加计数器变量是否足够?这样,如果您遍历树,您将知道重复条目的数量,并仍然保留订单。