[英]Java tree generation breadth first?
首先,如果您对大多数人都觉得这个问题很愚蠢,我真的感到很抱歉。 但是,我一般对编程和Java还是有些陌生,在这里我想做的是为正在处理的某些项目使用通用树。
规则是任何父节点都可以拥有尽可能多的子节点。
我也想按宽度生成树,这对我来说是有问题的。 是否有任何适合的Tree库,还是我应该实现自己的ADT?
我需要它来解决一些基本的AI问题,例如Farmer,Fox,Grain,Chicken问题。
public class Tree<T> {
private Node<T> root;
public Tree(T rootData) {
root = new Node<T>();
root.data = rootData;
root.children = new ArrayList<Node<T>>();
}
public static class Node<T> {
private T data;
private Node<T> parent;
private List<Node<T>> children;
}
}
这就是我到目前为止所掌握的。 我需要做的只是弄清楚如何以广度优先的方式添加节点。
请注意,我只需要能够添加数据。 我现在不在乎删除和根切换。
几年前,我在使用多个孩子进行“广度优先搜索”时,也做了类似的程序。 您需要做的是将Node类修改为如下形式:
class BFSNode {
int val;
BFSNode parent;
LinkedList<BFSNode> allChildren = new LinkedList<BFSNode>();
}
链接列表对于将所有子项保持在一起非常有用。 这是完整的代码,用于查找广度优先搜索算法(请注意,它可能是效率很低的程序,但是可以完成工作)
import java.util.LinkedList;
class BFSNode {
int val;
BFSNode parent;
LinkedList<BFSNode> allChildren = new LinkedList<BFSNode>();
}
public class BFSTree {
BFSNode root = null;
public void add(int insertVal, int parentVal) {
BFSNode newNode = new BFSNode();
newNode.val = insertVal;
BFSNode parentNode = null;
if (root == null) {
root = newNode;
System.out.println("Added insertVal :" + insertVal + " at parent :"
+ root.val);
} else if (root.val == parentVal) {
root.allChildren.add(newNode);
System.out.println("Added insertVal :" + insertVal + " at parent :"
+ root.val);
} else {
parentNode = BFS(parentVal);
if (parentNode == null) {
System.out.println("Parent does not exist");
} else {
parentNode.allChildren.add(newNode);
System.out.println("Added insertVal :" + insertVal
+ " at parent :" + parentNode.val);
}
}
}
public BFSNode BFS(int parentVal) {
BFSNode markBfsNode = root;
LinkedList<BFSNode> childrenQueue = new LinkedList<BFSNode>();
while (true) {
for (int i = 0; i < markBfsNode.allChildren.size(); i++) {
if (markBfsNode.allChildren.get(i).val == parentVal) {
return markBfsNode.allChildren.get(i);
} else {
childrenQueue.add(markBfsNode.allChildren.get(i));
}
}
if (childrenQueue.getFirst() == null) {
System.out.println("Element not found");
return null;
} else {
markBfsNode = childrenQueue.getFirst();
childrenQueue.poll();
}
}
}
public void printBFS() {
BFSNode markBfsNode = root;
LinkedList<BFSNode> childrenQueue = new LinkedList<BFSNode>();
System.out.print(root.val + " ");
while (true) {
for (int i = 0; i < markBfsNode.allChildren.size(); i++) {
childrenQueue.add(markBfsNode.allChildren.get(i));
}
try {
if (childrenQueue.getFirst() == (null)) {
return;
} else {
System.out.print(childrenQueue.getFirst().val + " ");
markBfsNode = childrenQueue.getFirst();
childrenQueue.poll();
}
} catch (Exception e) {
return;
}
}
}
}
class BFSImplementation {
public static void main(String args[]) {
BFSTree obj = new BFSTree();
obj.add(5, 0);
obj.add(7, 5);
obj.add(9, 5);
obj.add(11, 5);
obj.add(15, 5);
obj.add(17, 9);
obj.add(19, 9);
obj.add(21, 9);
obj.add(23, 19);
obj.add(27, 19);
obj.add(29, 7);
obj.add(31, 7);
obj.add(33, 11);
obj.add(35, 11);
obj.add(37, 21);
obj.add(39, 21);
obj.add(111, 29);
obj.add(111, 29);
obj.add(111, 29);
System.out.println();
obj.printBFS();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.