public class Tree extends Process {
    int parent = -1;
    int level;
    public Tree(Linker initComm, boolean isRoot) {
        super(initComm);
        if (isRoot) initiate();
    }
    public void initiate() {
        parent = myId;
        level = 0;
        for (int i = 0; i < N; i++)
            if (isNeighbor(i))
                sendMsg(i, "invite", level);
        myWait();
    }
    public synchronized void handleMsg(Message m, int source, String tag) {
        if (tag.equals("invite")) {
            if (parent == -1) {
                parent = source;
                level = m.getMessageInt();
                for (int i = 0; i < N; i++)
                    if (isNeighbor(i) && (i != source))
                        sendMsg(i, "invite", level + 1);
            }
        }
    }
}