在Java中插入BST时遇到问题

在Java中插入BST时遇到问题,java,Java,我正在处理具有长单词列表的文本文件,并将它们插入到二叉树中。我有一个文本文件是一个未排序的单词列表,它可以很好地插入BST。但是排序形式的完全相同的单词列表给我带来了麻烦。我一直从我的插入函数中得到一个StackOverflower错误 private TreeNode insert(TreeNode iter, String item) { if (iter == null) { iter = new TreeNode(item); } else {

我正在处理具有长单词列表的文本文件,并将它们插入到二叉树中。我有一个文本文件是一个未排序的单词列表,它可以很好地插入BST。但是排序形式的完全相同的单词列表给我带来了麻烦。我一直从我的插入函数中得到一个StackOverflower错误

private TreeNode insert(TreeNode iter, String item) {
    if (iter == null) {
        iter = new TreeNode(item);
    } else {
        if (item.compareTo(iter.item) < 0 ) {
        iter.left = insert(iter.left, item);
        } else {
        iter.right = insert(iter.right, item);
        }
    }
    return(iter);
}
专用TreeNode插入(TreeNode iter,字符串项){
if(iter==null){
iter=新的TreeNode(项目);
}否则{
if(项目比较(iter项目)<0){
iter.left=插入(iter.left,项目);
}否则{
iter.right=插入(iter.right,项目);
}
}
返回(iter);
}

我的理论是,因为它是有序的,它只会调用insert right,导致它以某种方式溢出。如果有人知道如何解决这个问题,那就太好了

向BST提供排序列表时,根据排序顺序,所有元素将插入同一侧(全左或全右)。这会导致BST变得非常高且不平衡,导致非常深的递归,最终导致StackOverflowerError

关于BST,这是众所周知的。对于混合值,BST将相对平衡,所有分支具有相似的高度。使用已排序的值,树将变得不平衡,并有效地作为链接列表工作。为了使BST有效,您需要保持平衡

保持BST平衡的一种方法是使用,例如或。一个懒惰的解决方法是插入无序的值。然而,后者并不保证BST平衡。在最坏的极端情况下,值在洗牌后可以完全排序