回溯没有可变成员的树

时间:2014-10-22 04:33:17

标签: java scala oop tree functional-programming

我正在尝试创建一个递归树,parent引用childchild引用parent。我想要做的是从child whitout可变成员回溯树。这很难,因为给孩子一个对构造函数中parent的引用需要已经创建parent实例。

我只能想到两种方式,而且两种方式都不太好。第一种方式是休假

  1. 使用函数" setParent()"创建子实例它只能在私有布尔变量的帮助下工作一次。
  2. 创建父级并传递子实例。
  3. 父母将自己传递给" setParent()"。
  4. 之后,child引用了parent,并且不能使用setParent()。

    第二种方法是创建parentchild完全分开,但将它们保存在某种数据结构中,这种数据结构可以搜索某个孩子的parent,而另一种方式则可以搜索。{/ p>

    如果有更好的方法,请教我。我主要在java工作,但问题很笼罩。

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点,但我可能会给父母一个createChild方法,该方法创建一个新节点,将自己作为父节点传递,并在返回之前将此子节点添加到自身。你暗示的问题是,由于某种原因,让一个已经存在的父母很难,但如果你正在做一棵树,你应该知道谁的父母是谁的。如果不这样,树可能不是您正在寻找的数据结构。

我可能会对其构建,以便您的Element构造函数可以使用另一个Element。如果是这样,它会将私有变量(parent)设置为其他Element。如果在没有传入父元素的情况下创建它,它将永远不会有父元素。因此,类可能看起来像这样(显然省略了访问器和任何其他东西):

public class Element {

    private Element parent;
    private ArrayList<Element> children;

    // Constructor for a node with NO parent
    public Element() {
        this(null);
    }

    // Constructor for a node WITH a parent
    public Element(Element parent) {
        this.parent = parent;
        this.children = new ArrayList<Element>();
    }

    // Method to create a child element.
    public Element createChild() {
        Element ch = new Element(this);
        this.children.add(ch);
        return ch;
    }
}

如果你的问题是你试图通过从一个孩子追溯到某个祖先来建立一个“树”,那么我建议你注意到它实际上是一个列表,而不是一棵树。您可以从下到上制作列表,然后从列表末尾开始从上到下构建树。