1

だから私はバイナリ サーチ ツリーに取り組んでおり、レベル オーダー トラバーサルを実行する必要があります。同じレベルにあるすべてのキーを出力します。

私が今抱えている問題は、FIFO キューを作成する必要があることです。キューを作成しましたが、ノードをキューに追加しようとすると、an enclosing instance that contains Queue.Node is requiredエラー メッセージが表示され続けます。誰かが私が間違っていることを手伝ってくれますか?

これが現在のレベル オーダー トラバーサルです。

public void LevelOrder_Traversal(BST_Node node){
    Queue temp=new Queue();


    Queue.Node newNode=new Queue.Node();

    temp.enqueue(node);

これは私のキュークラスです

public class Queue{
public class Node{
    private Integer key;
    private Node next;

    public Node(){
        this.key=null;
        this.next=null;
    }

    public Node(int key){
        this.key=key;
        this.next=null;
    }
}

int size;
Node head;

public Queue(){
    head=new Node();
    size=0;
}

public void enqueue(Node node){
    if(size==0){
        head=node;
    }

    Node curr=head;
    while(curr.next!=null){
        curr=curr.next;
    }
    curr.next=node;
    size++;
}

public Node dequeue(){
    Node temp=head;
    head=head.next;
    size--;

    return temp;
  }
}

私がやっていることと似ている他のいくつかの投稿を見つけましたが、私はそれらをあまり理解していませんでした. 誰かが私が間違っていることと、なぜそれが間違っているのかを説明してくれるなら、それは素晴らしいことです. Queue クラスなどを拡張する必要がありますか?

4

2 に答える 2

1

これは、Node内部クラスが非静的であるためです。Java の非静的クラスには、それを囲むクラスへの暗黙的な参照があるため、外部クラスのインスタンス メソッドによってインスタンス化する必要があります。このようにインスタンス化します

Queue.Node newNode=new Queue.Node();

Nodeクラスがであっても、 は有効ではありませんpublic

staticこのコンパイルの問題を修正するには、キーワードを使用して宣言します。クラスを論理的に作成できます。これstaticは、そのメソッドが含まれているクラスの知識を必要としないためですQueue

于 2013-06-07T00:29:12.793 に答える
0

あなたは宣言します:

public class Queue {
    public class Node {

これは、Nodeインスタンスが存在するためには、 のインスタンスが必要Queueあることを意味します。したがって、メッセージ:「Queue.Node を含む囲んでいる [この場合はキュー] インスタンスが必要です」。

Nodeこのような設計でを取得するための非常に見苦しい構文は次のとおりです。

final Queue queue = new Queue();
final Node node = queue.new Node();

Node一般に、 が関連性を持つことが実際に必要な場合は、この設計を使用Queueします。私はそれを見たことがありません...プライベート内部クラスを除いて。

ただし、クラスを aとは別にNode作成できる場合は、次のように宣言する必要があります。Queuestatic

public class Queue {
    public static class Node { // <-- note the 'static'
于 2013-06-07T00:33:03.003 に答える