Java 循环树

Java 循环树,java,binary-tree,Java,Binary Tree,因此,我想知道,从雇员和雇主之间的关系中创建结构的最佳方法是什么,但以可能的周期为例 id: 1 boss: 2 id: 2 boss: 3 id: 3 boss: 1 Id: 4 boss: 1 id: 10 boss: 11 id: 11 boss: null 然后能够找到id为1的老板,例如 id: 1 boss: 2 id: 2 boss: 3 id: 3 boss: 1 Id: 4 boss: 1 id: 10 boss: 11 id: 11 boss: null 我一直在考虑简单

因此,我想知道,从雇员和雇主之间的关系中创建结构的最佳方法是什么,但以可能的周期为例

id: 1 boss: 2
id: 2 boss: 3
id: 3 boss: 1
Id: 4 boss: 1
id: 10 boss: 11
id: 11 boss: null
然后能够找到id为1的老板,例如

id: 1 boss: 2
id: 2 boss: 3
id: 3 boss: 1
Id: 4 boss: 1
id: 10 boss: 11
id: 11 boss: null
我一直在考虑简单树的反向关系,但如何准备周期

public class Tree<T> {
 private Node<T> root;

 public Tree(T rootData) {
    root = new Node<T>();
    root.data = rootData;
    root.employees = new ArrayList<Node<T>>();
 }

 public static class Node<T> {
    private T data;
    private List<Node<T>> employees ;
 }
}
公共类树{
私有节点根;
公共树(T根数据){
根=新节点();
root.data=rootData;
root.employees=new ArrayList();
}
公共静态类节点{
私有T数据;
私人名单雇员;
}
}

我已经用设计模式解决了这个问题

我使用了两种模式,即模式和模式

我用这段代码编写结构

所有节点的接口

public interface INode{
    //for appli visitor
    public void accept(IVisitor visitor);
}
用于实现叶节点

public class INodeLeaf implements INode{

    public String getFoo();
}
为了实现中间节点的抽象类,可以使用更多类型的中间节点

    public abstract class AbstractNode implements INode{

    private INode left;
    private INode right;

    public AbstractNode(INode left, INode right) {
        this.left = left;
        this.right = right;
    }

    public INode getLeft() {
        return left;
    }

    public INode getRight() {
        return right;
    }

}
您必须至少是AbstractNode中的一个具体节点

对于访问结构,您可以实现PatterVisitor,如下所示

public interface IVisitor {

    void visitNodeLeaf(NodeLeaf node);

    void visitYorConcreateNode(YourConcreateNode node);

}
public class StrategyFoo implement IStrategy{

   private IVisitor setTheVisitor;

//other
   public void runOperation(){//do nothind for moment}
}
实现可以是

public class VisitorFoo implements IVisitor {

    private String foo;

    @Override
    public void visitNodeLeaf(INodeFoglia node) {
        foo += node.getFoo();
    }

    @Override
    public void visitYorConcreateNode(NodeDivisione node) {
        node.getLeft().accept(this);
        node.getRight().accept(this);
    }
}
关于你的问题

my是树结构的一般实现。对于您的示例,您可以需要
列表
一个方法,访问者内部的
visitYorConcreateNode(..)
应该访问列表,但实现不变

用于结构上的操作复合体 对于结构上的复杂操作,我认为最好也使用pattor

此后

public interface IVisitor {

    void visitNodeLeaf(NodeLeaf node);

    void visitYorConcreateNode(YourConcreateNode node);

}
public class StrategyFoo implement IStrategy{

   private IVisitor setTheVisitor;

//other
   public void runOperation(){//do nothind for moment}
}

树的定义是非循环的。您需要的可能是一个有向图。如果您允许员工-雇主关系中存在一个循环,或者您需要允许同一员工有多个上司,则会出现断开连接的组件。你们最初的用例是什么?是的,所以我一直在考虑树的列表。但是自行车仍然会有问题,每个人都会有很少的老板