繁体   English   中英

Java树结构和广度优先搜索

[英]Java Tree Struct & Breadth-first-search

我基于根节点创建了一个简单的参数化树结构。 每个节点均包含其子注释的数组列表以及指向其父项的链接。 那很简单。

现在,我无法解决(不久的将来)的问题:

我想在这棵树上写广度优先搜索。 我想借助(已实现的)迭代器接口来实现此功能。 但是我真的无法解决这个问题:问题是同样可迭代的List结构。 我不知道如何实现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;
}
...

公共类Node {

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); 

}
...   

您的iterator()方法将创建一个Iterator<Node<T>> ,它将使用仅包含根的Queue<Node<T>>进行初始化。

Iterator.next()将从堆栈中获取第一个元素,将其所有子元素插入堆栈,然后将其返回。 [别忘了也弹出]

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

还要注意,从语法上讲,您应该实现Iterable<T>而不是Iterator<T> 您将创建的迭代器(如上所述)将实现Iterator<T>

您的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());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM