我的bst必须能够处理重复的条目。有没有人有任何策略如何解决这个问题,不需要过多的代码? 我想到一直在向右边添加重复项,但那会破坏bst顺序。例如,当副本有两个孩子,而这两个孩子又有两个孩子时会发生什么?插入副本很容易,但是它替换的节点要做什么?
答案 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
中的每个item1
和item2
都会treeNode.items
。
要插入重复元素,您会找到相关的TreeNode
对象,并向items
添加新项目。
查找元素的逻辑与之前几乎相同,只是一旦找到相关的TreeNode
对象,就必须走链表。
答案 2 :(得分:0)
我想知道你是否真的需要将重复的条目存储为单独的节点?向您的Node添加计数器变量是否足够?这样,如果您遍历树,您将知道重复条目的数量,并仍然保留订单。