Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在树上实现函数_Java_Data Structures_Tree_Elements - Fatal编程技术网

Java在树上实现函数

Java在树上实现函数,java,data-structures,tree,elements,Java,Data Structures,Tree,Elements,我正在处理一个问题,该问题要求我为给定的接口实现几个函数 我有一个接口是树中的单个节点,还有一个接口是树 TreeNode: 树: 我被要求: 使用最后一个子/上一个同级实现这些接口 方法创建MyTreeNode.java和MyTree.java,它们将扩展Tree和TreeNode MyTreeNode.java定义为: 扩展TreeNode.java的实现 MyTree.java定义为: 扩展Tree.java的实现 所以我开始构建MyTree.java。问题是,我不知道如何扩展接口和实现方

我正在处理一个问题,该问题要求我为给定的接口实现几个函数

我有一个接口是树中的单个节点,还有一个接口是树

TreeNode:

树:

我被要求:

使用最后一个子/上一个同级实现这些接口 方法创建MyTreeNode.java和MyTree.java,它们将扩展Tree和TreeNode

MyTreeNode.java定义为:

扩展TreeNode.java的实现

MyTree.java定义为:

扩展Tree.java的实现

所以我开始构建MyTree.java。问题是,我不知道如何扩展接口和实现方法。对我来说,听起来好像是想让我实现接口并构造定义的方法。据我所知,只有一个接口可以扩展另一个接口

另一个问题是,如果没有适当的左、右节点,我将如何创建许多这样的函数?我认为我不允许修改现有的接口Tree.java和TreeNode.java

有谁能用外行的语言帮我解释一下我应该做什么吗?

你们班需要,比如:

在java中,您只能扩展一个类,并实现一个接口。您是对的,只有接口可以扩展另一个接口。我认为问题在于创建一个实现接口的类

在您的实现中,您将定义适当的左和右节点。因此,在您要实现的每个特定函数中,您可以直接引用这些字段


要回答您关于术语的问题:

是的,你是对的,你的导师/ TA根本没有准确地写出来,可能是因为它们来自C++背景,在接口/基类和扩展/实现之间没有严格的区分。我相信你的解释就是他们想要的

正如问题明确提到的,与接口中的第一个孩子、下一个兄弟姐妹相比,使用最后一个孩子、上一个兄弟姐妹来实现,我认为您不应该使用左/右来实现,这实际上意味着同时存储上一个孩子和下一个兄弟姐妹,这似乎违背了练习的目的。我认为他们只是把问题弄得很棘手,不现实,但找到方法很有趣

不存储下一个同级的一种方法是在节点(即父节点)中存储和附加属性。第一个孩子,下一个兄弟姐妹和最后一个孩子,上一个兄弟姐妹实际上是同一个东西,意思是代表

   A
   |
   V
[B C D] 
第一个孩子,下一个兄弟姐妹正在存储:

   A
   |
   V
   B -> C ->D
最后一个孩子,前一个兄弟姐妹,如果我猜对的话,是

   A
   +--------+
            V
   B <- C <-D       (and B,C,D is storing a parent ref pointing to A)

只想告诉您如何实施两个关键方法,另一个留给您自己

谢谢。我就是这么想的。您能推荐如何创建一个变量来保存根节点和左右子节点吗?我不确定这一点,因为界面不包括这些。非常感谢你澄清这个问题。我的教授有时会这样含糊其辞。我将如何准确地实现这些功能?我不知道下一步该怎么做,因为没有预定义的根或左/右子级。如果你的下一个孩子是左-右/上一个,这将非常容易,但我怀疑这是否是你教授想要的。让我用一些代码更新我已经更新了我的代码以适合你的伪代码。下面是我当前代码的粘贴库:我现在正在处理的是前序和后序遍历。然而,我不知道如果没有左撇子和右撇子,如何做到这一点。很抱歉,我没有完全理解,我对这一点还不熟悉。谢谢。无法在工作时看到您的pastebin代码。但是,如果实现了getFirstChild和getNextSibling,则后序/前序遍历应该是直接进行的。您的遍历代码可以简单地使用这些方法。e、 g.preOrderTraverse{resultList+=this;for n=firstChild;n!=null;n=n.getNextSibling{resultList+=n.preOrderTraverse;}`我还没有实现getFirstChild。我现在拥有的两个数据成员是lastChild和prevSibling,我看不出它们对getFirstChild有什么帮助。但我可能弄错了。我需要一些方法来访问下一个元素,而不是同一行的同级元素,但我没有这些数据成员。我会这样做吗我们不能为此目的创建一个吗?
   A
   |
   V
[B C D] 
   A
   |
   V
   B -> C ->D
   A
   +--------+
            V
   B <- C <-D       (and B,C,D is storing a parent ref pointing to A)
/** Tree node implementation using "last-child-prev-sibling" */
MyTreeNode<E> implements TreeNode<E> {
    MyTreeNode<E> parent;
    MyTreeNode<E> lastChild;
    MyTreeNode<E> prevSibling;

    // I bet it is add child, which add a new child to the last
    public void setChild(TreeNode<E> child) {
        if (! (child instanceof MyTreeNode)) {
            throw new SomeKindOfImpatibleTypeException();
        }
        MyTreeNode<E> newLastChild = (MyTreeNode<E>) child;
        newLastChild.parent = this;
        newLastChild.previousChild = this.lastChild;
        this.lastChild = newLastChild;
    }

    public TreeNode<E> getNextSibling() {
        if (this.parent == null) {
            return null;
        }
        MyTreeNode<E> n = this.parent.lastChild;
        if (n == this) {
            return null;
        }
        for ( ; n != null; n = n.prevSibling) {
            if (n.prevSibling == this) {
                return n;
            }
        }
        return null;
    }

    public TreeNode<E> firstChild() {
        if (lastChild == null) {
             return null;
        }
        for (TreeNode<E> n = lastNode; 
             n.prevSibling != null; 
             n=n.prevSibling) {
        }
        return n;
    }
}