2012-02-08 71 views
0

我创建了一个基于根节点的简单参数化树结构。每个节点都拥有其子注释的数组列表以及指向其父代的链接。这很简单。Java树结构和广度优先搜索

现在,我没有能够解决(在不久的将来)一个问题:

我想写在这个树广度优先搜索。我想在(实现的)迭代器接口的帮助下实现此功能。但我真的无法把这个工作: 问题是也迭代列表结构。我不知道如何实现hasNext(),next()和remove()函数:/

你有什么想法吗?

问候

代码:

public class Tree<T> implements Iterator<T>{ 

private Node<T> root; 

/** 
* Default constructor. 
*/ 
public Tree() { 
    super();   
} 

/** 
* Return the root Node of the tree. 
* @return the root element. 
*/  
public Node<T> getRoot() { 
    return this.root; 
} 

/** 
* Set the root Element for the tree. 
* @param Root the root element to set. 
*/ 
public void setRoot(Node<T> Root) { 
    this.root = Root; 
} 
... 

公共类节点{

public List<Node<T>> children; 
public Node<T> parent; 
public T data; 

/** 
* Default constructor. 
*/ 
public Node() { 
    super(); 
} 

/** 
* Create a Node<T> with an instance of T. 
* @param data an instance of T. 
*/ 
public Node(T nodeData) { 
    this(); 
    setData(nodeData);   
} 

/** 
* Create a Node<T> with an instance of T. 
* @param data an instance of T. 
*/ 
public Node(T nodeData, Node<T> parentNode) { 
    this();  

    setData(nodeData); 
    setParent(parentNode); 

} 
... 
+0

树不应该执行' Iterator ',它应该实现'Iterable '。迭代器应该是一个单独的类,它的一个实例由Iterable返回。iterator()'方法。 – 2012-02-08 14:17:35

回答

1

iterator()方法CREA te Iterator<Node<T>>,将使用仅包含根的Queue<Node<T>>进行初始化。

Iterator.next()将从堆栈中取第一个元素,将所有子元素插入堆栈并返回它。 [不要忘了弹出它]

Iterator.remove()将从其父母的列表中删除最后一个元素children [您可以使用您的parent字段访问父母。

另请注意,在句法上,您应该执行Iterable<T>而不是Iterator<T>。您将创建的迭代器[如上所述]将执行Iterator<T>

+0

删除节点后,迭代器可能希望从队列中删除其子节点。但是不能从队列末尾删除元素。您必须将Queue更改为Deque或使用第二个Queue来记住您必须忽略的节点。 – Robert 2012-02-08 16:12:08

0

您的Node类需要实现Iterable接口而不是`Iterator'接口。

Iterable接口基本上说'这个类可以返回一个迭代器并被迭代',而Iterator接口说'我可以迭代某些东西并返回这些项目'。 Iterable接口需要执行Iterator才能工作。

下面是一个快速,人为的例子(未经测试,但你应该得到的要点)。

public class MyList implements Iterable<Integer> { 

    public List<Integer> x; 

    public Iterator<Integer> iterator() { 
     return new MyListIterator(this); 
    } 

} 

这里将是该类一个简单的迭代器:

public class MyListIterator implements Iterator<Integer> { 

    private List<Integer> list; 
    private int index; 

    public MyListIterator(MyList list) { 
     this.list = list; 
     this.index = 0; 
    } 

    public boolean hasNext() { 
     return this.index < this.list.x.size() 
    } 

    public Integer next() { 
     Integer i = this.list.x.get(this.index); 
     this.index += 1; 
     return i; 
    } 

    public void remove() { 
     //Not implemented 
    } 

} 

它可以帮助你看到你将如何使用明确的迭代器:

MyList list = new MyList(); 
Iterator<Integer> iterator = list.iterator(); 
while (iterator.hasNext()) { 
    System.out.println(iterator.next()); 
} 
+0

首先,非常感谢您的快速反馈和解释!在我的实现中,通过节点而不是树实现迭代不是更好吗?我有点困惑... – 2012-02-08 14:37:05

+0

是的,当然。这个例子是为了展示这些接口如何一起工作,而不是你应该如何自己实现它们。 @amit在你的'Iterator'中描述你需要的算法。 – Peter 2012-02-08 14:45:27