繁体   English   中英

Java树生成广度优先?

[英]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.

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