2014-05-16 49 views
0

我已经编写了以下程序以最大化Java中的堆。在Java中最大化堆 - 堆栈溢出错误


package heap; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Scanner; 

public class HeapMaxify 
{ 
    public static void main(String[] s) 
    { 
     List<Integer> inp = new ArrayList<Integer>(); 
     Scanner inpObj = new Scanner(System.in); 
     inp.add(inpObj.nextInt()); 
     for(int i=1;i<=inp.get(0);i++) 
      inp.add(inpObj.nextInt()); 
     System.out.println("Current heap follows :"); 
     int elemInLine = 1; 
     int count = 0; 
     for(int i=1;i<=inp.get(0);i++) 
     { 
      System.out.print(inp.get(i)+"\t"); 
      count++; 
      if(count==elemInLine) 
      { 
       System.out.println(); 
       count = 0; 
       elemInLine *= 2; 
      } 
     } 
     maxifyHeap(inp,1); 
     System.out.println("Maxified heap follows :"); 
     elemInLine = 1; 
     count = 0; 
     for(int i=1;i<=inp.get(0);i++) 
     { 
      System.out.print(inp.get(i)+"\t"); 
      count++; 
      if(count==elemInLine) 
      { 
       System.out.println(); 
       count = 0; 
       elemInLine *= 2; 
      } 
     } 
    } 
    private static void maxifyHeap(List<Integer> inp, int curIndex) 
    { 
     int leftIndex = 2*curIndex; 
     int rightIndex = (2*curIndex)+1; 
     int largestIndex=0; 
     int temp; 
     if(leftIndex<=inp.get(0)&&inp.get(leftIndex)>inp.get(curIndex)) 
      largestIndex = leftIndex; 
     else 
      largestIndex = curIndex; 
     if(rightIndex<=inp.get(0)&&inp.get(rightIndex)>inp.get(largestIndex)) 
      largestIndex = rightIndex; 
     if(largestIndex!=curIndex) 
     { 
      temp = inp.get(largestIndex); 
      inp.set(largestIndex, inp.get(curIndex)); 
      inp.set(curIndex, temp); 
        maxifyHeap(inp, largestIndex); 
     } 
    } 
} 

我得到的输出INP相同。 我觉得我期待递归方法改变inp ArrayList是有问题的。

回答

0

你是 - 始终 - 递归调用maxifyHeap,所以它的堆栈溢出,修复你的递归调用,而不是无限递归。

+0

这对我来说很愚蠢。让我尝试一下。 – mbsingh

+0

Entropy, 谢谢。 把去年if语句里面的递归调用的工作是这样的: 如果(!largestIndex = curIndex) \t \t { \t \t \t TEMP = inp.get(largestIndex); \t \t \t inp.set(largestIndex,inp.get(curIndex)); \t \t \t inp.set(curIndex,temp); \t \t \t maxifyHeap(inp,largestIndex); \t \t} 但现在的问题是,它不是最大化堆,即输入和输出是相同的: 我认为在我调用递归方法后期望inp ArrayList发生改变时出现了问题。 关于我如何解决这个问题的任何输入? – mbsingh