2016-04-06 13 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

コードを修正し、メインとノードの2つのクラスに分割しました。今私はそれをテストし、それは働いています。主な間違いは、ツリー全体にアクセスするための唯一の参照であるため、ルートを変更できないことです。代わりに、子ノードに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

ありがとうございました! –

関連する問題