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 的封闭 [Queue in this case] 实例”。

为了获得Node这样的设计,相当笨拙的语法是:

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

通常,如果实际上需要完全相关,则使用此Node设计Queue。我从来没有见过......除了私人内部课程。

但是,如果您的Node类可以独立于 a创建Queue,则必须声明它static

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