我请求帮助实现Java中的常规树

时间:2016-05-05 18:19:56

标签: java tree nodes

我想出了以下内容,尝试在java中创建一般树:

import java.util.*;

public class GeneralTree<T>{

    private GeneralNode<T> root;
    private GeneralNode<T> parent;
    private GeneralNode<T> children;

    public GeneralTree(){
        this(null);
    }

    public GeneralTree(T d){
        this(d, null);
    }

    /* I don't know what to do here. I want
     * to assign a parent node to every 
     * tree I make, but if I keep the
     * second parameter as GeneralNode<T>, wouldn't
     * that mean I could only ever have one GeneralTree?
     */
    public GeneralTree(T d, GeneralNode<T> p){
        root = new GeneralNode<T>(d);
        parent = p;
    }
}

这非常适合存储信息。它允许我创建一个节点并在该节点中插入更多节点,同时在每个节点中具有一种类型的信息。不幸的是,似乎我无法在此类中引用“父”节点。基本上,我在向量中嵌套向量,所以我实际上无法引用持有节点的节点。

我确定我必须制作一个单独的GeneralTree类才能完成这项工作,但我不确定我该怎么做。我有想法将根分配为GeneralNode,并将“previous”和“next”节点分别作为父节点和子节点。这是我到目前为止所提出的:

let FIREBASE_REF = Firebase(url: BASE_URL)

var CURRENT_USER: Firebase
{
    let userID = NSUserDefaults.standardUserDefaults().valueForKey("uid") as! String

    let currentUser = Firebase(url: "\(FIREBASE_REF)").childByAppendingPath("users").childByAppendingPath(userID)

    return currentUser!
}

我已经对我困惑的构造函数写了评论。我希望我已经很好地解释了我的问题。如果有人可以帮助我,那将是伟大的。

1 个答案:

答案 0 :(得分:0)

正如@JohnBollinger所说,你可以在每个节点内保留父节点的引用。如果这样做,则必须在addChild方法中设置父节点。

import java.util.Vector;

public class GeneralNode<T>{

    private T data = null;
    private Vector<GeneralNode<T>> children = 
            new Vector<GeneralNode<T>>();

    private GeneralNode<T> parentNode;

    //constructors

    private void setParent(GeneralNode<T> parentNode) {
        this.parentNode = parentNode;
    }

    public void addChild(T d){
        GeneralNode<T> c = new GeneralNode<T>(d);
        c.setParent(this);
        this.children.add(c);
    }

    public void addChild(GeneralNode<T> c){
        c.setParent(this);
        this.children.add(c);
    }

    //other methods
}