当前位置: 首页 > 知识库问答 >
问题:

二叉搜索树与AVLTree问题

陈淳
2023-03-14

我正在为分配制作二叉搜索树和AVL树。

尝试向二叉搜索树添加1,000,000个元素时遇到问题,但我可以向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个答案

彭博厚
2023-03-14

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的行为。您希望级别为日志(15000)而不是15000。您将通过使用平衡的结构来实现这一点。它仍将是BST树,但附加的约束是级别为O(log n)。因此,一旦您完成了BST,一定要尝试AVL:)

 类似资料:
  • 我很难按我教授想要的格式打印出一个二叉搜索树。 他的格式是这样的: 我的代码:

  • 树的特征和定义 树(Tree)是元素的集合。我们先以比较直观的方式介绍树。下面的数据结构是一个树: 树有多个节点(node),用以储存元素。某些节点之间存在一定的关系,用连线表示,连线称为边(edge)。边的上端节点称为父节点,下端称为子节点。树像是一个不断分叉的树根。 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent)。比如说,3,5是6的子节点,6是3,

  • 我正试图解决这个问题,但我遇到了一些麻烦: 在二进制搜索树(BST)中: 节点左子树中每个节点的数据值小于该节点的数据值。 节点右侧子树中每个节点的数据值大于该节点的数据值。 如您所见,节点(4)位于节点(3)的左侧子树中,尽管4大于3,因此方法应该返回。但是,我的代码返回。 我怎么能控制这个案子?如何检查左/右子树中的所有值都低于/大于根(不仅是直接子树)?

  • 编写一个函数,如果给定的二叉搜索树包含给定的值,则返回1,否则返回0。 例如,对于以下树: N1(值:1,左:null,右:null) n2(值:2,左:n1,右:n3) N3(值:3,左:null,右:null) 对contains(&n2,3)的调用应返回1,因为根位于n2的树包含编号3。 函数应该返回1,然而,它返回0或者根本不返回。

  • 在二元搜索树的情况下,为什么我们不能简单地在一个节点有两个子节点的情况下,将一个节点的前一个节点替换为后一个节点?