Java OutOfMemory递归创建树时出错?

Java OutOfMemory递归创建树时出错?,java,recursion,tree,Java,Recursion,Tree,假设N是根数,这三个将创建一个N-1、N-2、N-3的左中右节点 例: 等等 我的TreeNode类具有以下变量: 5 / | \ 4 3 2 /|\ 3 2 1 每当我构造一个整数大于28的树时,我都会得到一个OutOfMemoryError。我的递归方法是效率非常低还是很自然?谢谢 理论上,深度为N的完整三元树将有(3^(N+1)-1)/2个节点。如果N为28,则为34315188682441个节点。如果每个节点只占用1个字节,那么仍然是31.2 TB的RAM。在

假设N是根数,这三个将创建一个N-1、N-2、N-3的左中右节点

例:

等等

我的TreeNode类具有以下变量:

     5
   / | \
  4  3  2
 /|\
3 2 1

每当我构造一个整数大于28的树时,我都会得到一个OutOfMemoryError。我的递归方法是效率非常低还是很自然?谢谢

理论上,深度为N的完整三元树将有
(3^(N+1)-1)/2个
节点。如果N为28,则为34315188682441个节点。如果每个节点只占用1个字节,那么仍然是31.2 TB的RAM。在那之前,您的内存将远远不足

编辑:但是,您的代码似乎没有生成完整的树。当我运行以下程序来计算新节点的数量时:

private int number;
private TreeNode left, middle, right;
假定您的
TreeNode
构造函数不创建新节点,它表明您在N=28时创建了34850335个新节点,在N=29时创建了64099760个新节点。考虑到您暗示N=28成功,这更有意义。由于您没有显示
TreeNode
,因此我们无法准确判断它将使用多少内存,但这些数字与典型的JVM内存限制在同一数量级内。您可以稍微增加您的最大JVM内存,以挤出一个或两个以上的级别


但是,您可能希望准确思考生成此树的原因,并尝试提出一种不同的算法来执行您正在执行的操作。

当N为29时,生成的树应具有1680万个节点。由于您没有向我们展示TreeNode,我不知道每个节点有多少字节;但我看不出这会给你带来什么麻烦。你的堆大小设置为多少?它是用来做家庭作业的。基本上,它指定在给定根编号时创建整个树。我从一位助教那里读到一条评论,指出“应该没有内存错误。”但我认为这句话与他们的测试标准有关,而不是我们的程序本身。当时我没有意识到这一点,并开始认为他的意思是程序不应该有任何内存错误。然而,您的描述帮助我更好地理解了这一点,因为我并没有完全意识到我的代码实际上创建了一个不平等的树(尽管这是我计划的)。非常感谢你!对每个人来说,艾尔
private int number;
private TreeNode left, middle, right;
static long nodes = 0;

static void constructTree(int N) {
   if (N > 0) {
       ++nodes;
       constructTree(N-1);
   }
   if (N > 1) {
       ++nodes;
       constructTree(N-2);
   }
   if (N > 2) {
       ++nodes;
       constructTree(N-3);
   }
}

public static final void main (String[] args) throws Exception {
    nodes = 1;
    constructTree(28);
    System.out.println(nodes);
}