2016-08-12 4 views
0

Java에서 최적 이진 검색 트리 문제를 구현하기 위해 노력하고 있습니다. 내 프로그램의 경우, 첫 번째 줄은 노드의 수이고 각 줄은 공백으로 구분되는 txt 파일에서 읽습니다. 첫 번째 요소는 노드이고 두 번째 요소는 확률입니다. 다음은 내 프로그램에서 읽고 샘플 입력 : 내 프로그램에서최적의 이진 검색 트리 구현을 사용하여 ArrayindexOutOfBoundsException java

5 
A 0.213 
B 0.547 
D 0.10 
X 0.12 
AAA 0.02 

, 나는 내가 프로그램을 실행할 때, 나는 그것의 가능성이 무엇인지, 그것이 무엇 노드 볼 수 있도록 인쇄 방법을 만들려고하고 있어요 , 그 부모는 무엇이며, 그들의 자녀는 무엇인가.

Node 
Key: B 
Probability: 21.3% 
Parent: (null) 
Left Child: A 
Right Child: X 

내가 지금으로 실행이 트리 미세의 루트를 읽고 있다는 것입니다하지만 잠시 후 나에게 밖으로 색인을 줄 것입니다 문제 : 한 노드의 출력 예제가 아래에 제공 범위. 다음은 내 코드를 실행할 때이 내가 수신하고 출력은

public static void printTree(String keys[], double prob[], int root[][]){ 
System.out.println(""); 
int pos = root[1][keys.length-1]; 
int t=pos; 

for(int i = 0; i < keys.length-1; i ++){ 

    System.out.println("Node Key "+ pos); 
    System.out.println("Key: "+ keys[pos]); 
    System.out.println("Probability: "+ prob[pos]); 

    if(i ==0){ 
     System.out.println("Parent: null"); 
     System.out.println("Left Child: "+ keys[pos-1]); 
     System.out.println("Right Child: "+ keys[pos+1]); 
     if(root[1][pos]==t){ 
      pos-=1; 
     } 
    } 

    else{ 

     System.out.println("Parent: "+ keys[pos+1]); 
     System.out.println("Left Child: "+ keys[pos-1]); //where the error is occurring 
     System.out.println("Right Child: "+ keys[pos+1]); 
     pos--; 
    } 


    System.out.println(""); 
} 
} 

내 인쇄 트리 방법에 대한 내 코드입니다 :

분명히
Node 
Key: B 
B is the root 

Node Key 2 
Key: B 
Probability: 0.547 
Parent: null 
Left Child: A 
Right Child: D 

Node Key 1 
Key: A 
Probability: 0.213 
Parent: B 
Left Child: null 
Right Child: B 

Node Key 0 
Key: null 
Probability: 0.0 
Parent: A 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
at OBST.printTree(OBST.java:62) 
at OBST.main(OBST.java:155 

내가 증가하고 크기를 감소 시도는하지만 여전히 그럴 때 IndexOutofBoundsException이 발생합니다. 나는 그 문제가 무엇인지를 믿는다. 그것은 루트를 읽는 것이고, 그 다음에는 목록을 내려 가서 멈추지 않는다.

누군가가이 문제에 대해 도움을 줄 수 있다면 매우 감사하겠습니다.

EDIT : 노드를 포함하도록 인쇄 방법을 재구성했지만 여전히 ArrayIndexOutofBoundsException이 발생합니다.

Node 
Key: B 
Probability: 0.547 % 
Parent: B 
A is the left child of B 





Node 
Key: B 
Probability: 0.547 % 
Parent: B 
X is the right child of B 





Node 
Key: X 
Probability: 0.12 % 
Parent: X 
D is the left child of X 





Node 
Key: X 
Probability: 0.12 % 
Parent: X 
AAA is the right child of X 



Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 
at OptimalBT.Optimal.constructTree(Optimal.java:117) 
at OptimalBT.Optimal.constructTree(Optimal.java:127) 
at OptimalBT.Optimal.main(Optimal.java:90) 
+0

노드 키는 0으로 표시되고 노드 키는 pos의 값입니다. 그래서 pos는 0입니다. 키 [-1]과 같을 키 [- 1]를 할 때 어떤 배열 위치를 얻을 것으로 예상합니까? – Asthor

+0

내 희망은 B의 오른쪽 자식 인 노드 4에 인쇄한다는 것입니다.하지만이 프로그램은 확률이 높고 아래로 내려 가고 있습니다. 그래서 만약 노드 2에서 시작한다면, 그 다음에 1 번 노드를 인쇄 한 다음 0과 – user2580

답변

1

난 당신이 귀하의 이진 트리를 표현하려고하는 가정을 만드는 중이라서 다음이 내가 수신하고 출력은

public static void printTree(int i, int j, int pos, String side, String keys[], double prob[], int root[][], Nodes[] node){ 

    int temp;  
    if(i<=j){ 

     temp = root[i][j]; 
     System.out.println("Node"); 
     System.out.println("Key: " + keys[pos]); 

     System.out.println("Probability: "+ prob[pos]+" %"); 
     System.out.println("Parent: "+ keys[pos]); 
     System.out.println(keys[temp] + " is the "+ side +" child of "+ keys[pos]); 
     for(int k =0; k< keys.length-1; k++){ 

      if(keys[pos].equalsIgnoreCase(node[k].getKey())){ 
       if(side.equalsIgnoreCase("left")){ 
        node[i].setLeftChild(keys[temp]); 
       } 
       else{ 
        node[i].setRightChild(keys[temp]); 
       } 

      } 

      System.out.println(" "); 


     } 
     constructTree(i,temp-1,temp,"left", keys, prob, root, node); 
     constructTree(temp+1,j,temp,"right", keys, prob,root, node); 

    } 

노드 클래스를 사용하는 업데이트 방법 2 차원 배열 코드에서

당신은 쓰기 : 몇 문제는 여기에있다

System.out.println("Parent: "+ keys[pos+1]); 
System.out.println("Left Child: "+ keys[pos-1]); 
System.out.println("Right Child: "+ keys[pos+1]); 

.

먼저 코드는 올바른 하위 항목이 부모와 동일한 위치에 있음을 의미합니다 (키 [pos + 1] 모두). 이것은 정확하지 않습니다. 올바른 아이는 부모와 같은 노드가 아닙니다.

둘째, 왼쪽 자식이 [pos-1] 키에 있고 오른쪽 자식이 [pos + 1] 키에 있음을 의미합니다. 이것은 정확하지 않습니다. 배열의 "K"위치에있는 노드의 경우 해당 노드의 왼쪽 자식은 "2K"위치에 있고 해당 노드의 오른쪽 자식은 "2K + 1"위치에 있습니다.

알버타 대학 웹 사이트에서 알기에 좋은 사진이 있습니다. 이진 트리를 표현하기 위해 2 차원 배열 인덱스를 사용하는 방법을 이해하는 데 도움이됩니다.

enter image description here

Source

나는 귀하의 의견이 형식에 실제로 기대, 그리고 당신이 그것을 깨닫지 못하고

.

노드 {이름, 부모, left_child, right_child, 기회} 지수 그런 랩 어라운드하지 않는

Node1 {A, null, B, D, 21.3} 
Node2 {B, A, X, AAA, 54.7} 
Node3 {D, A, null, null, 10.0} 
Node4 {X, B, null, null, 12.0} 
Node5 {AAA, B, null, null, 2.0} 
+0

오류가 발생합니다. 그러나 이것은 indexoutofbounds 예외를 계속 유지하면서 문제를 해결하지 못합니다. 이것은 부분적인 문제를 해결하는 데 도움이됩니다. – user2580

0

: 그것은 당신이 실제로 입력으로 다음이 의미 할 것입니다. 배열 키의 인덱스는 0에서 keys.length-1까지입니다. 따라서 pos가 0 일 때 System.out.println("Left Child: "+ keys[pos-1]);을 수행하면 프로그램이 색인 -1에 액세스 할 수 없다는 오류 메시지에서 볼 수 있듯이 색인 -1에 액세스하려고합니다.

그러나 나는 당신이 정확히 원하는 것을 알아 내려고 힘들 때가 있습니다. 인쇄가 올바른지 말할 수 없도록 노드를 삽입하는 방법을 알지 못합니다. 그래서 제 대답은 다소 제한적입니다.

그러나 귀하의 의견에 따라 인덱스 2에 액세스하려면 keys.length-1이 필요합니다. 그렇게하기 위해 감싸 야합니다. 가장 쉬운 방법은 모듈을 사용하는 것입니다. 따라서 keys[pos-1] 대신 keys[(pos-1)%keys.length] 또는 keys[(pos+1)%keys.length]을 사용하십시오.