Java在树上实现功能

时间:2015-09-29 01:32:41

标签: java data-structures tree elements

我正在研究一个问题,要求我为给定的接口实现几个函数。

我的接口是树中的单个节点,而接口是树。

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 )。

任何人都可以帮助我以外行的方式向我解释我应该做的事情吗?

3 个答案:

答案 0 :(得分:0)

您的课程需要implement the interface,例如:

public class MyTree<E> implements Tree<E> {
   // implement the methods of interface.
}

答案 1 :(得分:0)

  1. 在java中,您只能扩展类,实现接口。你纠正了只有接口可以扩展另一个接口。我认为问题是要创建一个实现接口的类。

  2. 在您的实施中,您将定义正确的左侧&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个关键方法,另一个留给自己