2013-04-16 5 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(). Вам нужно переопределить этот метод внутри узла, чтобы показать, что вы хотите. –

0

В вашей строке System.out.println(node); вы говорите Java, чтобы позвонить node.toString(). Поскольку вы не создали свой собственный метод toString() для настраиваемого класса Node, Java автоматически использует метод Object.toString(), который возвращает адрес памяти. Подумайте о том, чтобы добавить в код что-то вроде следующего:

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

Я сделал метод toString() в моем классе Node, но теперь выход для сбалансированного дерева просто печатает 26 до 2 в порядке убывания. – WhisperingRhino

+0

Ну, порядок вывода - это совсем другое дело. Поэкспериментируйте с порядком трех операторов: 'print (currentNode)', 'print (leftNode)', 'print (rightNode)'. Рассмотрите http://en.wikipedia.org/wiki/Tree_traversal. – SimonT

+0

Я хочу напечатать дерево, используя обход уровня, в моем методе уровня печати, im печатать корневой, затем левый узел, правый узел, а затем перейти на следующий уровень. Это неправильно? – WhisperingRhino

Смежные вопросы