2017-12-13 18 views
0

バイナリ検索ツリー(ユーザ入力を使用)を実装し、値を検索して実際にこの値を見つけるために必要な反復回数を表示するプログラムを作成することはできません。 イテレーションの数を返すgetLastIterationCount()というメソッドを作成しましたが、メインメソッドで印刷したいときに、 'System.out.println(getLastIterationCount())'という行にエラーが表示されます。 ; '私の方法は正しい場所にないと思うが、何が欠けているのか分からない。どのように私はこのプログラムを動作させることができる任意のアイデア?BSTで値を見つけるために必要な反復回数を出力するにはどうすればよいですか?

 /* Class Node */ 
class Node 


{ 
Node left, right; 
int data; 



/* Constructor */ 
public Node(int n) 
{ 
    left = null; 
    right = null; 
    data = n; 
}   

/* Function to get data from node */ 
public int getData() 
{ 
    return data; 
} 

/* Function to get left node */ 
public Node getLeft() 
{ 
    return left; 
} 

/* Function to get right node */ 
public Node getRight() 
{ 
    return right; 
    } 
} 

/* Class BST */ 
class BST 

{ 

private Node root; 
private int iterations; 
/* Constructor */ 
public BST() 
{ 
    root = null; 
} 
/* Functions to insert data */ 
public void insert(int data) 
{ 
    root = insert(root, data); 
} 
/* Function to insert data recursively */ 
private Node insert(Node node, int data) 
{ 
    if (node == null) 
     node = new Node(data); 
    else 
    { 
     if (data <= node.data) 
      node.left = insert(node.left, data); 
     else 
      node.right = insert(node.right, data); 
    } 
    return node; 
} 


    /* Functions to search for an element */ 
public boolean search(int val) 
{ 
    iterations=0; 
    iterations++; 
    return search(root, val); 
} 



/* Function to search for an element recursively */ 
private boolean search(Node r, int val) 
{ 
    iterations=0; 
    boolean found = false; 
    while ((r != null) && !found) 
    { 
     int rval = r.getData(); 
     if (val < rval){ 
      r = r.getLeft(); 
     } 

     else if (val > rval){ 
      r = r.getRight(); 
     } 

     else 
     { 
      found = true; 
      break; 
     } 
     found = search(r, val); 

    } 

    return found; 
} 

    public int getLastIterationCount(){ 
    return iterations; 
    } 


    } 
    /* Class LinkedListBST */ 
    public class LinkedListBST 
    { 


public static void main(String[] args) 

{ 


    Scanner scan = new Scanner(System.in); 
    /* Creating object of BST */ 
    BST bst = new BST(); 
    System.out.println("Linked List Binary Search Tree Test\n");   
    char ch; 
    /* Accept input */ 
    do  
    { 
     System.out.println("Enter integer element to insert"); 
     bst.insert(scan.nextInt());      



     System.out.println("\nDo you want to continue (Type y or n) \n"); 
     ch = scan.next().charAt(0); 


    } while (ch == 'Y'|| ch == 'y'); 
    System.out.println("\nEnter an element to be searched: "); 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Search result : " + bst.search(sc.nextInt())); 

    System.out.println(getLastIterationCount()); //ISSUE IS HERE 

    sc.close(); 

    } 

    } 

答えて

0

あなたの検索コードはすでに正確に近いと思います。

private boolean search(Node r, int val) { 
    ++iterations;  // increment counter by one for current iteration 

    boolean found = false; 
    while ((r != null) && !found) { 
     int rval = r.getData(); 
     if (val < rval){ 
      r = r.getLeft(); 
     } 
     else if (val > rval) { 
      r = r.getRight(); 
     } 
     else { 
      found = true; 
      break; 
     } 

     found = search(r, val); 
    } 

    return found; 
} 

私はここにそれを想定しています:プライベート内部検索方法を呼び出すたびに、いずれかによってカウンタをインクリメントで、その後

public boolean search(int val) { 
    iterations = 1; 
    return search(root, val); 
} 

を:まず、検索するために外部のエントリポイントでカウンタを初期化します値を見つけるために必要な再帰呼び出しの数が必要です。代わりに、アイテムが見つかった高さが必要な場合は、別の質問です。

編集:

私はあなたが、カウントを返すためのgetterメソッドを持っていることに気づきました。これは、インスタンスメソッドであり、あなたはそれゆえ、このようなとしてそれを呼び出す必要があります:あなたはメソッドgetLastIterationCount()にアクセスしている

bst.getLastIterationCount(); 
+0

私はあなたの助言に従いました、ありがとう、それは私の 'System.out.println(getLastIterationCount());のように見えます。 Netbeansによって間違っているように下線が引かれています。私のメソッド 'getLastIterationCount()'が間違った場所にあるので、printステートメントが関数呼び出しを認識できなくなりますか? –

+1

こんにちは私の答えを見て、それを試してみてください! –

+0

@humanbeingはい、特定のツリーインスタンスのカウントを取得するには、 'bst.getLastIterationCount()'を呼び出す必要があります。しかし、私はまた、より大きな問題は、あなたの数えるロジックと考えています。 –

0

は、あなたが以下のようにインスタンス化したオブジェクトのBSTを使用してメソッドを呼び出す必要がありますオブジェクトなし。 bst.getLastIterationCount()

+0

他の回答の下にコメントして回答を広告しないでください。 –

+0

私は彼が言及した問題を解決するために私の答えに彼を指していた、私はそれが広告であるかどうかわからない、私は無関係な何かを話していない! –

+0

あなたは正しいとはいえ、これは問題の一部に過ぎません。 –

1

bst.getLastIterationCount() 
関連する問題