我正在研究一个问题,要求我为给定的接口实现几个函数。
我的接口是树中的单个节点,而接口是树。
TreeNode :
package main;
import java.util.List;
public interface TreeNode<E> {
public E getElement();
public void setElement(E elem);
public void setChild(TreeNode<E> child);
public TreeNode<E> getFirstChild();
public List<TreeNode<E>> getChildren();
public void setNextSibling(TreeNode<E> sibling);
public TreeNode<E> getNextSibling();
public int size();
public int height();
public List<TreeNode<E>> getPreOrder();
public List<TreeNode<E>> getPostOrder();
public String toString(TreeNode<E> node);
}
树:
package main;
import java.util.List;
public interface Tree<E> {
public TreeNode<E> getRoot();
public int size();
public int height();
public List<TreeNode<E>> getPreOrder();
public List<TreeNode<E>> getPostOrder();
public void makeEmpty();
public boolean isEmpty();
public int height(TreeNode<E> node);
public int depth(TreeNode<E> node);
}
我被要求:
使用last-child / previous-sibling实现这些接口 方法。创建将扩展Tree和TreeNode的MyTreeNode.java和MyTree.java。
MyTreeNode.java 定义为:
扩展TreeNode.java的实现。
MyTree.java 定义为:
扩展Tree.java的实现。
所以我开始构建 MyTree.java 。问题是,我不知道如何&#34; 扩展&#34;接口并实现方法。对我而言,听起来好像我想要实现接口并构建定义的方法。据我所知,只有一个接口可以扩展另一个接口。
另一个问题是,如果没有适当的左右节点,我将如何创建许多这些功能?我相信我不允许修改现有的接口( Tree.java 和 TreeNode.java )。
任何人都可以帮助我以外行的方式向我解释我应该做的事情吗?
答案 0 :(得分:0)
您的课程需要implement the interface,例如:
public class MyTree<E> implements Tree<E> {
// implement the methods of interface.
}
答案 1 :(得分:0)
在java中,您只能扩展类,实现接口。你纠正了只有接口可以扩展另一个接口。我认为问题是要创建一个实现接口的类。
在您的实施中,您将定义正确的左侧&amp;正确的节点。因此,在您正在实施的每个特定功能中,您可以直接实现这些字段。
答案 2 :(得分:0)
回答关于术语的问题:
是的,你是对的,你的教练/ TA根本就没有准确地编写它(可能它们更多来自C ++背景,在interface / base-class和extends / implements之间没有严格的区别)。我相信你的解释实际上是他们正在寻找的东西。
由于问题明确提到使用“last-child,prev sibling”(与界面中的“first-child,next-sibling”相比),我相信你不应该使用left / right(实际上意味着存储上一个和下一个兄弟姐妹,这似乎打败了这个练习的目的)。我认为他们只是让问题变得棘手而且不现实,但找到方法很有趣。
不存储“下一个兄弟”的一种方法是在节点中存储和额外属性,即父节点。 “First-child,Next-Sibling”和“Last-Child,Prev-Sibling”实际上是相同的,这意味着代表
A
|
V
[B C D]
第一个孩子,Next Sibling正在存储:
A
|
V
B -> C ->D
Last Child,Previous Sibling,如果我的猜测正确,则存储
A
+--------+
V
B <- C <-D (and B,C,D is storing a parent ref pointing to A)
因此,为了实现TreeNode.firstChild()
,您只需转到lastChild()
,并继续通过prevSibling
进行迭代,直到找到没有prevSibling
的节点(即没有兄弟姐妹的节点意味着它是儿童中的第一个节点。
同样,要实施TreeNode.nextSibling()
,您需要转到parent
的{{1}},并继续查找lastChild
等于prevSibling
的节点(即找到自己作为上一个兄弟节点的节点,这意味着该节点是我的下一个兄弟节点。)
一些伪代码:
this
只是为了让您了解如何实现2个关键方法,另一个留给自己