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

将排序数组转换为二叉搜索树 (Java) 堆栈溢出异常

丘普松
2023-03-14

这是一个程序,用于将元素按升序排序的数组转换为高度平衡的BST。

我输入五个元素,将它们传递给一个数组,对数组进行排序并使用方法。

它会产生这个错误:

Exception in thread "main" java.lang.StackOverflowError
    at Solution.sortedArrayToBST(Node.java:26)

如何修复此错误?

import java.util.*;

class Node {
    int val;
    Node left;
    Node right;

    Node(int x) {
        val = x;
    }
}

class Solution {

    public Node sortedArrayToBST(int[] num) {
        if (num.length == 0)
            return null;

        return sortedArrayToBST(num, 0, num.length - 1);
    }

    public Node sortedArrayToBST(int[] num, int start, int end) {

        int mid = (start + end) / 2;
        Node root = new Node(num[mid]);
        root.left = sortedArrayToBST(num, start, mid - 1);
        root.right = sortedArrayToBST(num, mid + 1, end);

        return root;
    }

    public static void main(String[] args) {

        Solution sol = new Solution();

        Scanner input = new Scanner(System.in);
        int[] numbers = new int[5];

        System.out.println("Please enter numbers");
        for (int i = 0; i < numbers.length; i++) {
            numbers[i] = input.nextInt();
        }

        // sorting
        for (int j = 0; j<numbers.length; j++) {
            for (int k = 0; k < numbers.length; k++){
                if (numbers[j] < numbers[k]) {
                    int buffer = numbers[j];
                    numbers[j] = numbers[k];
                    numbers[k] = buffer; 
                }
            }
        }

        sol.sortedArrayToBST(numbers, 0, 5);
        sol.sortedArrayToBST(numbers);
    }

}

共有2个答案

姜乐语
2023-03-14

方法sortedArrayToBST(num, start, end)没有终止条件,这就是为什么它永远不会结束,因为您收到了StackOverFlow错误。您需要在方法的开头添加一个条件:if(开始

罗均
2023-03-14

sortedArrayToBST with array调用sortedArrayToBST with 3个参数(这反过来又用一个参数调用同一个方法),您永远无法摆脱它。

您一次又一次地用一个参数向sortedArrayToBST发送相同大小的相同数组。相反,您应该创建新的阵列,将它分成两部分(中低和中1到高)

 类似资料:
  • 我正在研究“将排序数组转换为具有最小高度的二叉搜索树”,它问: 给定一个排序(递增顺序)数组,将其转换为最小高度的二叉树。 我无法找到为什么我的递归没有像我预期的那样停止。当7通过时,它应该停止,并且不会再次打印出7。我还发现了一个类似的答案,看起来使用了和我相同的策略,但效果很好。(我不认为我的问题与上面列出的问题重复,但我仍然想感谢您为我链接这些问题。他们给了我更多解决问题的想法。) 我的代码

  • 我想把一个排序的整数数组转换成一个二叉搜索树。我相信我知道该怎么做。我已经在下面发布了我的伪代码。我无法想象的是递归实际上是如何工作的。 如果我的数组是1,2,3,4,5。。。我首先将3作为我的BST的根,然后将2作为3的左子节点。那么我要把1设为2的左子节点,然后返回到2吗?我不明白递归是如何贯穿整个过程的。。。 提前感谢,如果这个问题解释得不好,请道歉。我不想要显式的代码,但如果有人能帮我解释

  • HLOJ 9576,习题7-2 二叉排序树 输入一个整数关键字序列,生成一棵用链式存储结构存储的二叉排序树,对该二叉排序树能进行查找和插入结点的操作,并对该二叉排序树中结点的关键字按递增和递减顺序输出。 要求依次完成以下工作: (1) 以这n个整数生成(建立)一棵用链式存储结构存储的二叉排序树; (2) 按递增顺序输出该二叉排序树中的整数(关键字); (3) 输入一个整数key1,对该二叉排序树进

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • 我想到了以下几点: < li >将树退化为链表,在退化的同时,用链表中的节点对象及其索引创建一个动态数组 看起来像这样 这是一个学生必须在没有任何过去考试参考的情况下编码的问题。我方法的问题是,我几乎不可能在30分钟内正确地写下所有代码,如果我事先记住一些代码,也许是可能的。我想知道是否有一个更简单、更可行和优雅的解决方案来将任何二叉树转换为适当的堆?

  • 我希望将二叉树表示为数组,以便数组在数组中表示为空的广度一阶。我不想使用数组列表,但很乐意使用链表结构。我发现数组的最大大小的大小将是2^n-1,其中n是以下情况下树的高度: 数组的最小大小(除了空树或没有子项的根 [大小为 0 和 3 相应])为 (2^n - 1) - 6,在这种情况下,6 可以计算为前一个级别的空位数乘以 2: 这些树是否可以表示为堆,其中位于索引0并且当前节点在索引i处的左