2016-11-17 4 views
1

私は過去2日間、バイナリツリーで作業していました。私が問題があると思われる作業の1つは、BinaryTreeクラスのpreOrderTraversalメソッドとpostOrderTraversalメソッドを表示することです。現時点では、displayInOrderメソッドのみを表示できます。このミスを修正するために私は何ができますか?Java:先行予約と後続予約のトラバースを表示

public class BinaryTree { 
BinaryTreeNode root = null; 

public void insertInTree (int newData) { 
    if (root == null) 
     root = new BinaryTreeNode(newData); 
    else root.insert(newData); 
    } 


    public void displayInOrder() { 
     displayInOrder (root); 
    } 

    public void preOrderTraversal() { 
     preOrderTraversal (root); 
    } 

    public void postOrderTraversal() { 
     postOrderTraversal (root); 
    } 

    public void preOrderTraversal (BinaryTreeNode subRoot) { 
     if (subRoot == null) return; 
     preOrderTraversal(subRoot.getLeft()); 
     System.out.println(" " + subRoot.getData() + " "); 
     preOrderTraversal(subRoot.getRight()); 
    } 

    public void postOrderTraversal (BinaryTreeNode subRoot) { 
     if (subRoot == null) return; 
     postOrderTraversal(subRoot.getLeft()); 
     System.out.println(" " + subRoot.getData() + " "); 
     postOrderTraversal(subRoot.getRight()); 
    } 

    public void displayInOrder (BinaryTreeNode subRoot){ 
     if (subRoot == null) return; 
     displayInOrder (subRoot.getLeft()); 
     System.out.print(" " + subRoot.getData() + " "); 
     displayInOrder (subRoot.getRight()); 

    } 


    } 

public class BinaryTreeNode { 
private int data; 
private BinaryTreeNode left; 
private BinaryTreeNode right; 

public BinaryTreeNode() { 
    left = null; right = null; data = 0; 
} 
public BinaryTreeNode(int data) { 
    left = null; right = null; this.data = data; 
} 
public int getData() { 
    return data; 
} 
public BinaryTreeNode getLeft() { 
    return left; 
} 
public BinaryTreeNode getRight() { 
    return right; 
} 
public void insert (int newData) { 
    if (newData < data) { 
     if (left == null) 
      left = new BinaryTreeNode(newData); 
     else left.insert(newData); 
    } else if (newData > data) { 
     if (right == null) 
      right = new BinaryTreeNode(newData); 
     else right.insert(newData); 
    } else 
     System.out.println("Duplicate – not adding……" + newData); 
} 



} 




public class BinaryTreeExample { 

public static void main(String[] args) { 
    BinaryTree tree = new BinaryTree(); 

    tree.insertInTree(6); 
    tree.insertInTree(3); 
    tree.insertInTree(9); 
    tree.insertInTree(1); 
    tree.insertInTree(15); 
    tree.insertInTree(7); 

    tree.displayInOrder(); 

} 

} 
+0

;'他の機能を逃したが、私はその問題を解決し、私のコードを変更することができた –

+0

を呼び出す:あなたのラッパー・メソッドの最後の改行を印刷する必要があります。ツリーを表示することはできますが、表示されているpreOrderおよびpostOrderトラバーサルメソッドはまだ間違っています。これらは表示されますが、displayInOrderメソッドと同じ順序です。 – xy1990

+0

それは本当に難しいことではありません、単に私はあなたのロジックに取り組んで、あなたのコードで何が起こっているかを見るためにデバッグを使うことを提案します。 –

答えて

0

略称トラバーサルの定義:左=、自己、右

  • "事前に注文" =自己、左、右
  • "ポスト順序"

    • "順番に" =左、正しい、自己

    コードに適用すると、「print self」行を移動するだけでよい:

    public void preOrderTraversal (BinaryTreeNode subRoot) { 
        if (subRoot == null) return; 
        System.out.print(" " + subRoot.getData() + " "); 
        preOrderTraversal(subRoot.getLeft()); 
        preOrderTraversal(subRoot.getRight()); 
    } 
    
    public void postOrderTraversal (BinaryTreeNode subRoot) { 
        if (subRoot == null) return; 
        postOrderTraversal(subRoot.getLeft()); 
        postOrderTraversal(subRoot.getRight()); 
        System.out.print(" " + subRoot.getData() + " "); 
    } 
    
    // already correct 
    public void displayInOrder (BinaryTreeNode subRoot){ 
        if (subRoot == null) return; 
        displayInOrder (subRoot.getLeft()); 
        System.out.print(" " + subRoot.getData() + " "); 
        displayInOrder (subRoot.getRight()); 
    } 
    

    これらのメソッドは内容を印刷するだけです。あなたはこれだけ `tree.displayInOrder()を呼び出すため

    public void displayInOrder() { 
        displayInOrder (root); 
        System.out.println(); 
    } 
    
    public void preOrderTraversal() { 
        preOrderTraversal (root); 
        System.out.println(); 
    } 
    
    public void postOrderTraversal() { 
        postOrderTraversal (root); 
        System.out.println(); 
    } 
    
  • +0

    ありがとう、それは本当に役立ちます。もう一つ、それが表示されると、それは奇妙なフォーマットをしています。 DisplayInOrderは1、3、6、7、9、15と表示されますが、preOrderTraversalメソッドを使用すると6が表示され(最初の行に15から続く)、3,1,9,7,15が表示されます別の行。 1、3、7、15、9、6のpostOrderTraversalと同じこと – xy1990

    +0

    http://imgur.com/a/uduO1これは私の言いたいことです。 – xy1990

    +0

    私は印刷の種類に気付かなかった。編集済みの回答を参照してください。 FYI私はこれをリファクタリングして、内部メソッドに渡されるリスト内のノードを収集し、共通コードを使用してリストをレンダリングします。 3つのパーツのラムダを渡すことによってもファンシーになる可能性がありますが、内側のメソッドは1つだけですが、それはあまりにも遠すぎるかもしれません。 – Bohemian