所以我正在开发一个二叉搜索树,需要进行一个Level Order Traversal。我将打印出同一级别的所有密钥。
我现在遇到的问题是我需要创建一个FIFO队列。我创建了Queue但是当我尝试将节点添加到队列时,我不断收到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类或类似的东西?
答案 0 :(得分:1)
这是因为您的Node
内部类是非静态的。 Java中的非静态类具有对其封闭类的隐式引用,因此它们必须由外部类的实例方法实例化。像这样实例化
Queue.Node newNode=new Queue.Node();
无效,即使Node
类为public
。
使用static
关键字声明它来修复此编译问题:该类可以在逻辑上生成static
,因为它的方法不需要知道封闭的Queue
类。
答案 1 :(得分: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
完全相关,则使用此设计。我从未见过......除了私人内部类。
但如果Node
类可以<{1}}独立创建,则必须将其声明为Queue
:
static