2016-04-06 3 views
-1

У меня возникают некоторые проблемы при работе над этим заданием. В настоящее время я пытаюсь управлять этим. Я могу хранить и печатать значения, однако, когда я печатаю значения, он печатает только первое введенное мной значение. Любая помощь будет потрясающей! Я действительно мало знаю о рекурсии, и это как-то заставляет больно больно.Ошибка записи двоичного дерева рекурсии

package lab6; 

import java.util.Scanner; 

public class node { 

    private int value; 
    static node root; 
    public node leftLink; 
    public node rightLink; 

    public node(int v) { 
     this.value = v; 
    } 

    public int getValue() { 
     return value; 
    } 

    static void traverseShow() { 
     if (root.leftLink != null) { 
      root = root.leftLink; 
      traverseShow(); 
     } 
     System.out.println(root.getValue()); 
     if (root.rightLink != null) { 
      root = root.rightLink; 
      traverseShow(); 

     } 

     return; 
    } 

    static void addNode(node n) { 
     if (root == null) { 
      root = n; 
     } else { 
      node tmp = root; // save the current root 
      if (root.getValue() > n.getValue()) { 
       root = root.leftLink; 
       addNode(n); 
      } else if (root.getValue() < n.getValue()) { 
       root = root.rightLink; 
       addNode(n); 
      } 
      root = tmp; // put the root back to its original value 
     } 
     return; 
    } 

    public static void main(String[] args) { 
     int val = 0; 
     Scanner sc = new Scanner(System.in); 
     boolean loop = true; 
     String command = ""; 

     while (loop == true) { 
      System.out.println("Please enter a command:"); 
      System.out.println("A = insert a new value"); 
      System.out.println("B = display all values"); 
      System.out.println("C = exit program"); 
      command = sc.next(); 
      if (command.equalsIgnoreCase("a")) { 
       System.out.println("Enter value: "); 
       val = sc.nextInt(); 
       node newNode = new node(val); 
       addNode(newNode); 
      } else if (command.equalsIgnoreCase("b")) { 
       traverseShow(); 
      } else if (command.equalsIgnoreCase("c")) { 
       sc.close(); 
       System.exit(0); 
      } else { 
       System.out.println("Invalid command! Please try again."); 
      } 
     } 
    } 
} 
+1

Ваш класс 'node' не должен иметь переменную' node root'. И определенно не должно быть статичным. Кроме того, неясно, что именно не работает. –

ответ

1

Я скорректировал ваш код и разделил его на два класса: Main и Node. Теперь я тестировал его, и он работает. Основная ошибка заключается в том, что вы не можете изменить корень, потому что это наша единственная ссылка на доступ ко всему дереву. Вместо этого вы захотите сообщить дочернему узлу addNode (узел n) для вас. Именно тогда происходит рекурсия. То же самое относится к методу traverseShow(). Фактически, отладка поможет вам в этом много.

public class Node { 

    private int value; 
    public Node leftLink; 
    public Node rightLink; 

    public Node() { 

    } 

    public Node(int v) { 
     this.value = v; 
    } 

    public int getValue() { 
     return value; 
    } 

    void addNode(Node n) { 

     //node tmp = root; // save the current root 
     if (getValue() > n.getValue()) { 
      if(leftLink == null){ 
       leftLink = n; 
      }else{ 
       leftLink.addNode(n); 
      } 
     } else if (getValue() < n.getValue()) { 
      if(rightLink == null){ 
       rightLink = n; 
      }else{ 
       rightLink.addNode(n); 
      } 
      //root = root.rightLink; 
      //addNode(n); 
     } 
     //root = tmp; // put the root back to its original value 

     return; 
    } 

    void traverseShow() { 
     if (leftLink != null) { 
      leftLink.traverseShow(); 
     } 
     System.out.println(getValue()); 
     if (rightLink != null) { 
      rightLink.traverseShow(); 
     } 

     return; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 

     Node rootNode = null; 
     int val = 0; 
     Scanner sc = new Scanner(System.in); 
     boolean loop = true; 
     String command = ""; 

     while (loop == true) { 
      System.out.println("Please enter a command:"); 
      System.out.println("A = insert a new value"); 
      System.out.println("B = display all values"); 
      System.out.println("C = exit program"); 
      command = sc.next(); 
      if (command.equalsIgnoreCase("a")) { 
       System.out.println("Enter value: "); 
       val = sc.nextInt(); 
       Node newNode = new Node(val); 
       if(rootNode == null){ 
        rootNode = new Node(val); 
       }else{ 
        rootNode.addNode(newNode); 
       } 
      } else if (command.equalsIgnoreCase("b")) { 
       rootNode.traverseShow(); 
      } else if (command.equalsIgnoreCase("c")) { 
       sc.close(); 
       System.exit(0); 
      } else { 
       System.out.println("Invalid command! Please try again."); 
      } 
     } 
    } 
} 
+1

Большое вам спасибо за исправления! –

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