【问题标题】:Tree Implementation in JavaJava中的树实现
【发布时间】:2012-09-18 00:46:27
【问题描述】:

我得到了以下树:

然后我们被告知使用 last-child/previous-sibling 方法来改变这三个的实现。结果如下:

我现在正在研究 Java 实现以在这棵树上执行不同的功能。我们有一个 Tree 接口和一个 TreeNode 接口。它们都有很多我们要填写的功能。

节点是这样创建的:

MyTreeNode a = new MyTreeNode ("a");

以这种方式创建树(带有根):

MyTree     tree = new MyTree (a);

最后,节点被赋予兄弟姐妹孩子:

e.setChild(j);
e.setSibling(d);

我已经编写了 setChild、setSibling、getNextSibling、getFirstChild 和 getChildren 的方法。例如,这是 getChildren 的代码:

public List getChildren ()
{
    List <MyTreeNode> children = new ArrayList <MyTreeNode> ();

    MyTreeNode x = this.child;

    children.add(x);

    while (x != null && x.sibling != null) {
        x = x.sibling;
        children.add(x);
    }

    return children;
}

我现在完全不知道如何编写节点子树的高度、深度、大小、getPreOrder、getPostOrder 和树大小的方法。

由于树现在采用这种不同的表示形式,我不确定如何编写递归方法来检查节点的高度或深度。通常,据我了解,您会递归检查左/右子树..但现在没有(据我所知)。我能想到的唯一方法是使用许多 if 语句和 while 循环遍历每个节点。但这不是最好的方法。

如何使用这种树的实现递归地编写这些方法?

此外,我不确定如何获取有关整个树的详细信息,因为节点不会以任何方式存储在一起。它们是按照我上面展示的方式实现的,所以我不确定如何集体收集有关所有节点的数据。

如何在所有节点上创建树大小、isEmpty 或 makeEmpty 等方法?

抱歉解释过于冗长。

【问题讨论】:

    标签: java tree


    【解决方案1】:

    假设你的树有这样的节点结构:

    public class Node{
       String nodeName;
    
       Node left;
       Node right;
    
       public Node(String nodeName, Node left, Node right){
         this.nodeName = nodeName;
         this.left     = left;
         this.right= right;
       }
    }
    

    以下是我对如何构建新树的看法:当您向树中添加新节点时,您仍然需要维护树结构。根据您将节点添加到树中的方式,您仍将继续添加到父节点的左侧或右侧。

    一种可视化新树的可能方式是这样的:

                    A
                   /
                  E
                /   \
               D     J
             /   \   / \
            C    H  I   K
           /
          B
         /
        G
       /    
      F
    

    注意:我在这里假设如果它是一个孩子,它会被添加到你父母的左边。但这最好取决于您的要求

    如果您可以通过这种方式可视化这棵树,那么您用于获取高度、前序、后序遍历的递归函数仍然保持不变。

    更多提示:

    • 添加兄弟节点就像在节点的父节点的左侧或右侧添加一个节点,即如果当前节点位于其父节点的左侧,您将在右侧添加新节点。

    • 添加孩子将保持不变。根据您的逻辑,您可以将新节点添加为当前节点的左子节点或右子节点。

    【讨论】:

    • 感谢您的回复。但是,我看不到如何将其应用于我的特定树结构... B、C、D 和 E 都是兄弟姐妹,并且都是 A 的孩子...在您的图表中,它们不是兄弟姐妹。 F & G 和 I & K 也有同样的问题。因此使用这种方法会弄乱我树的原始结构。也就是说,除非我遗漏了什么。
    • @Jakemmarsh:您如何定义/区分 siblingchild
    • @Sujay - 兄弟节点是具有相同父节点的节点。子节点是来自父节点的节点?
    • @Sujay 在您的图表中,D 和 J 是兄弟姐妹,因为它们具有相同的父级。他们也是 E 的孩子。兄弟姐妹有相同的父母;孩子有父母。
    • @Jakemmarsh:按照兄弟姐妹的相同定义,在您的第二张图片中,B 的父母是 C,C 的父母是 D,D 的父母是 E,那么为什么 C、D 和 E 是兄弟姐妹?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多