2013-04-16 4 views
0

그래서 균형이 맞지 않는 이진 검색 트리를 만들 필요가 있습니다. 정렬 할 배열을 순차 탐색 (또는 적어도 시도한)을 기반으로 정렬 한 다음, 균형 이진 검색 트리를 밖으로. 여기에 시도했지만, 메모리 위치 만 출력하고 있습니다. 도움말!이진 탐색 트리 bst

public class BalanceTree { 
     public static BST balanceTree(int[]list){ 
     if(list.length==0)//if length is zero, then empty list, cannot balance 
     return null; 

     return balanceTree(list,0,list.length-1);}//recursively call balance 

    public static BST balanceTree(int[] list, int begin, int end){//take sorted array from unbalanced tree 
     if (begin>end) 
     return null; 
     int mid = (begin+end)/2;//find midpoint, assign as root node 
     BST chld = new BST(list[mid]); 
     chld.left = balanceTree(list,begin,mid-1);//assign as left child 
     chld.right = balanceTree(list, mid+1,end);//assign as right child 
     return chld; 
    } 


    public static void levelOrderPrint(Node node){ 
      int h = height(node); 
      for(int i=1; i<=h;i++){ 
       printLevel(node,i); //print every level 

      } 
    } 
    public static int height (Node t)//find height of tree 
     { 
     if (t.left == null && t.right == null) //leaf check 
      return 0; 
     else if (t.left == null) 
      return 1 + height(t.right); 
     else if (t.right == null) 
      return 1 + height(t.left); 
     else 
      return 1 + Math.max(height(t.left),height(t.right)); 
     } 

    public static void printLevel(Node node, int level){ 
      if(node ==null){ 
       return; 
      } 
      if(level == 1){ 
       System.out.println(node); 
      } 
      else if (level > 1){ 
       printLevel(node.left,level-1); 
       printLevel(node.right,level-1); 
      } 
     } 


    public static void main(String[] args) { 
     Node node = new Node(); 
     node.root=26; 
     int [] sortedArray = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26}; 


     System.out.println("Now Building Unbalanced Tree. Root Node: " + node.root); 
     node.insertNode(node, 25); 
     node.insertNode(node, 24); 
     node.insertNode(node, 23); 
     node.insertNode(node, 22); 
     node.insertNode(node, 21); 
     node.insertNode(node, 20); 
     node.insertNode(node, 19); 
     node.insertNode(node, 18); 
     node.insertNode(node, 17); 
     node.insertNode(node, 16); 
     node.insertNode(node, 15); 
     node.insertNode(node, 14); 
     node.insertNode(node, 13); 
     node.insertNode(node, 12); 
     node.insertNode(node, 11); 
     node.insertNode(node, 10); 
     node.insertNode(node, 9); 
     node.insertNode(node, 8); 
     node.insertNode(node, 7); 
     node.insertNode(node, 6); 
     node.insertNode(node, 5); 
     node.insertNode(node, 4); 
     node.insertNode(node, 3); 
     node.insertNode(node, 2); 
     node.insertNode(node, 1); 
     System.out.println("*********************************************"); 
     System.out.println("Now building balanced binary search tree: "); 

     //int[] arr = 
     levelOrderPrint(node);// I know this should be the array " arr" which is passed into the balance tree method 
    balanceTree(sortedArray,0,25);// I know this must use the array from the "levelorderPrint" method, 
    //but i could not get it to compile, so i substituted in an already sorted array. 



    } 
    } 

     public class BST{//constructing bst node 
     int val; 
     BST left; 
     BST right; 
     BST(int x){ 
     val = x;} 
    } 
    public class Node { 
Node node; 
int root; 
Node left; 
Node right; 

public void insertNode(Node node, int num) { //building unbalanced tree 
    if(num < node.root) // if current node is less than root node, insert to the left 
    { 
    while(node.left != null) 
    { 
    node = node.left; 
    if(num > node.root){ //if current node is greater than root node, insert to the right 

    Node temp = new Node(); 
    temp.root = num; 
    node.right = temp; 
    System.out.println("Inserting "+ num + "" + "at right of" + node.root); 
    } 
    } 
    Node temp = new Node(); 
    temp.root = num; 
    node.left = temp; 
    System.out.println("Inserting " +num + "" + "at left of" + node.root); 
    } 
} 

public String toString(){ 

    return root+ ""; 

} 


} 
+0

* "HELP!"* 질문하기! (그리고 우리에게 멈추지 마라.) –

+0

나는 사과한다! 내 levelOrderPrint 메서드가 노드 메모리 위치 대신 트리를 출력하지 않아야합니까? 나는 Java에 익숙하지 않고, 사전에 사과드립니다. 모든 도움이나 의견을 크게 주시면 감사하겠습니다. – WhisperingRhino

답변

0

Java의 모든 객체는 toString() 메소드를 구현합니다. 기본적으로 (Object 클래스로 작성된 것처럼) 객체는 "메모리 위치"를 인쇄합니다.

Java에서 개체를 인쇄하려면 toString() 메서드를 덮어 써야합니다.

+0

내 levelOrderPrint() 메서드가 수행하고있는 작업을 생각하기 때문에 혼란스러워합니다. – WhisperingRhino

+0

호출하려는 printLevel 메서드에서 : System.out.println (node); 이것은 Node.toString()을 인쇄한다는 것을 의미합니다. Node 내에서이 메소드를 다시 구현해야 원하는 것을 표시 할 수 있습니다. –

0

System.out.println(node);에서 node.toString()으로 전화하라고 알립니다. 사용자 지정 Node 클래스에 대해 toString() 메서드를 만들지 않았으므로 Java는 자동으로 Object.toString() 메서드를 사용하여 메모리 주소를 반환합니다. 코드에 다음과 같은 내용을 추가하십시오.

public class Node { 
    ... 
    public String toString() { 
     return root + ""; 
    } 
    ... 
} 
+0

Node 클래스에서 toString() 메서드를 만들었지 만 이제 균형 잡힌 트리의 출력은 내림차순으로 2에서 26까지 인쇄됩니다. – WhisperingRhino

+0

출력 순서는 완전히 다른 문제입니다. 'print (currentNode)','print (leftNode)','print (rightNode)'명령문의 순서를 시험해 보라. http://en.wikipedia.org/wiki/Tree_traversal을 고려하십시오. – SimonT

+0

내 인쇄 수준 방법에서 루트를 인쇄 한 다음 왼쪽 노드, 오른쪽 노드를 인쇄 한 다음 다음 수준으로 떨어 뜨리는 수준 순회를 사용하여 트리를 인쇄하려고합니다. 틀렸어? – WhisperingRhino