我正在为分配制作二元搜索树和AVL树。
当我尝试向二进制搜索树添加1,000,000个元素但我可以添加key->时遇到问题值对AVL树。(AVLTree没有问题)
如果我平衡二进制搜索树,那么与AVL树没有区别?(如果我平衡二叉搜索树它变成AVLTree会有什么意义?)
插入15,000个元素后,我从二进制搜索树中收到错误:
线程“main”中的异常java.lang.StackOverflowError
项目定义:
使用这些测试和为天真二进制搜索树创建的代码,进行比较
两种情况下AVL树和天真二叉搜索树的性能
搜索,插入和删除以及长序列上的树平衡。你应该
在树中运行最多1000000个元素的测试。
public class BinaryTreeExample {
public static void main(String[] args) {
new BinaryTreeExample().run();
}
static class Node
{
Node left;
Node right;
int value;
public Node(int value) {
this.value = value;
}
}
public void run() {
Node rootnode = new Node(25);
insert3(rootnode, 50_000);
for (int i = 0; i < 150_000; i++)
insert3(rootnode, i);
System.out.println("Bittaaa");
// System.out.println(getNodesCount(rootnode));
}
protected int getNodesCount(Node root) {
if (root != null) {
int counter = 1;
counter += getNodesCount(root.left);
counter += getNodesCount(root.right);
return counter;
} else
return 0;
}
void insert3(Node node, int value) {
if (value < node.value) {
if (node.left == null)
node.left = new Node(value);
else
insert3(node.left, value);
} else {
if (node.right == null)
node.right = new Node(value);
else
insert3(node.right, value);
}
}
public void printInOrder(Node node) {
if (node != null) {
printInOrder(node.left);
System.out.println(" Traversed " + node.value);
printInOrder(node.right);
}
}
}
答案 0 :(得分:2)
StackOverflowError来自于您以递归方式实现insert
这一事实。在这种情况下,如果添加元素1,2,3,....,15000
,您的树将具有级别15000
,并且您的递归将溢出堆栈。强制执行它,你不会得到StackOverflowError。它应该像
void insert (Node node, int value) {
while (true) {
if (value < node.value) {
if (node.left == null){
node.left = new Node(value);
break;
}
else
node = node.left;
}
else {
if (node.right == null){
node.right = new Node(value);
break;
}
else
node = node.right;
}
}
}
但整个方法并不是最优的。上述行为不是您对BST的期望。您希望级别为log(15000)
而不是15000
。您将通过使用平衡结构来实现这一目标。它仍然是BST树,但附加约束条件是级别为O(log n)。所以一旦你完成了BST,一定要尝试AVL:)