二叉搜索树和AVLTree问题

时间:2014-01-15 16:27:50

标签: java algorithm tree binary-search-tree

我正在为分配制作二元搜索树和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);
        }
    }
}

1 个答案:

答案 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:)