Java树初学者的问题?

时间:2011-02-18 18:17:31

标签: java

今天我被告知使用以下类创建树数据结构

public class Node(){
private string lable;
private List<Node> children;
}

在开始创建树之后,我首先发现了。

它包含节点内的节点。我完全糊涂了。好吧,树可能对你很熟悉。 您可能会认为Whats this! Its clear. How you getting confused之类的东西。

对我来说,这是我第一次尝试在java中创建一个树。说实话,我只在java中的类中使用了setter和getter。使用这些方法,我想不到在第一级之后插入新节点。

我在google中看过一些例子,在stackoverflow中有很多例子。但对于像我这样的初学者(在树上)他们看起来不完整。可能他们可能认为,OP可以继续这样做。

如果有人向我解释它的概念以及如何添加更多的孩子,那么我会很感激。

更新

可能看起来很适合你,但这就是我从一开始就开始的方式。

Node node = new Node();
String label = "Bikes";
ArrayList<Node> children = new ArrayList<Node>();

    Node childNode = new Node();
    childNode.setLabel("Yamaha");
    children.add(childNode);

    childNode = new Node();
    childNode.setLabel("Suzuki");
    children.add(childNode);

    childNode = new Node();
    childNode.setLabel("Honda");
    children.add(childNode);

    node.setLabel(label);
    node.setChildren(children);

之后,就像我告诉我无法想到下一个级别。 在做了一些搜索后,我发现他们正在使用方法addChild()

然后我创造了我的,

    public void addChildren(Node node){
    children.add(node);
}

我继续这样,

        ArrayList<Node> children = new ArrayList<Node>();

    node.setLabel(label);
    node.addChildren(node);

现在我再次来到这里。我再也想不到在根节点上添加更多分支了。我希望这能说清楚一些。

6 个答案:

答案 0 :(得分:3)

首先删除类名中的():

应该是:

public class Node { 
....

修改

我在时间之前按下sumbit。这是完整的答案(提示:你现在可以撤消downvote:P)

它们被称为树,因为一个分支可能有叶子或其他分支。

这就是节点内部可能有其他节点的原因。

当节点没有子节点时,则在一个叶子中。当它是一个分支。

所以,它会是这样的:

import java.util.*;
// This is your existing code:
class Node { 
    private String label;
    private List<Node> children = new ArrayList<Node>();

    // Here's how you would build one with that strucure
    public static void main( String ... args ) { 

        Node one = new Node();
        one.label = "1";

        Node two = new Node();
        two.label = "2";

        Node root = new Node();
        root.label = "plus";
        root.children.add( one );
        root.children.add( two );

        print( root );
    }

    // Here's how you'll print the values
    static void print( Node node ) { 

         System.out.println( node.label );

         for( Node child : node.children ) { 
            // if child is a branch 
            if( child.children.size() > 0 ) { 
                // print the branch ( recursively ) 
                print( child );
             } else { 
                // is a leaf, just print the label.
                System.out.println( "-- ["+child.label+"]" );
             }
          }
     }
} 

这是一个根节点(“plus”)有两个子节点(“1”和“2”),这些节点又可能有一些其他节点(这不是这里的情况),就像树一样。

我希望这对你有所帮助。

答案 1 :(得分:2)

关于复合模式: wikipedia definition
首先尝试理解它。我认为Java语法不是问题 我希望这对你有帮助。

答案 2 :(得分:1)

您的原始问题相当含糊,但要回答您的问题?节点内的节点。如果可视化它,树由分支(节点)组成,每个分支可以有子分支,依此类推。

好的解释here

答案 3 :(得分:1)

树以父节点开始。每个节点都有一个标签,可以有0到多个孩子。您有节点列表的原因是因为它们是该给定节点的子节点。

答案 4 :(得分:1)

我认为这里更大的问题是你在考虑如何编写一个函数来解决树上的任务。对于列表,它是直截了当的。循环遍历列表中的项目并使用列表的当前项执行某些操作。

但是,由于树是不同的数据结构,因此您需要使用不同的方法来执行类似的步骤。使用树的最简单方法是编写recursive method。这是一种在某种程度上调用自身以便做更多工作的方法。

recursiveFunction(Node n) {
  do work for current node

  for(Node child : children) {
    recursiveFunction(child);
  }
}

可能需要一点思考才能看到当前节点需要完成哪些工作,以及是否存在基于其值的特殊情况,但结构看起来类似。

答案 5 :(得分:0)

在OscarRYZ的答案中在递归方法print(Node)中,print(Node)方法本身被调用:

if( child.children.size() > 0 ) {
                // print the branch ( recursively )
                print( child );
             }else {
                // is a leaf, just print the label.
                System.out.println( "-- ["+child.label+"]" );
             }

只要节点是分支,这个print(Node)方法就会被递归调用,当它到达一个叶子时,它只会用叶子打印叶子的标签 System.out.println( "-- ["+child.label+"]" );
 并回到它的分支。