在 Java 中创建一棵树

Creating a tree in Java

我写了下面的树class:

public class Tree {

    private TreeNode root;


    private static class TreeNode {
        private Pair<String, Float> data;
        private TreeNode leftNode;
        private TreeNode rightNode;

        private TreeNode( Pair<String, Float> data, TreeNode left, TreeNode right) {
            this.data = data;
            this.leftNode = left;
            this. rightNode = right;
        }
    }
}

以下输入:

"<Hello, 123>"
"<Hi, 1234>"
"<John, 42142>"
"null"
"<Chris, null>"
"<Peter, null>"
"null"

现在,我想编写一个将此输入作为 ArrayList 的函数,如下所示:

ArrayList<Pair<String,Float> input = {"<Hello, 123>", "<Hi, 1234>", "<John, 42142>", "null", "Chris, null", "Peter, null", "null"};

并使用上面定义的类型创建 Tree

注意:如果在数组的某个位置值为null,则意味着那里不应该有节点。

这是我到目前为止所做的:

public createTree(ArrayList<Pair<String, Float>> treeAsVector) {

    int nodes = treeAsVector.size();

    root = new TreeNode(treeAsVector.get(0), null,null);

     for (int i = 1; i < treeAsVector.size(); i++) {

        if(treeAsVector.get(i) == null)
            i++;//skips the node
        else
            //not sure what to do here

}

}

我需要帮助,因为我不太了解我应该如何创建树,因为每个 TreeNode 都需要另外两个 TreeNode's,这意味着我总是必须看到领先一步...

更新:

到树的映射应按如下级别完成:

                     TreeNode
                      (root) 
          TreeNode             TreeNode
             2                     3
 TreeNode       TreeNode  
    4               5     

如果 ArrayList 中的值为 null,则不表示。

public void generateTree(ArrayList<Pair<String , Float>> vector){
    //todo holds all nodes that haven't yet had their children assigned
    ArrayList<TreeNode> todo = new ArrayList<>();
    todo.add(new TreeNode(vector.remove(0) , null , null));
    TreeNode root = todo.get(0);

    while(!todo.isEmpty() && !vector.isEmpty())
    {
        TreeNode node = todo.remove(0);

        if(node == null)
            continue;

        //generate the children for the current node
        TreeNode left = vector.get(0) == null ? null : new TreeNode(vector.get(0) , null , null);
        TreeNode right = vector.get(1) == null ? null : new TreeNode(vector.get(1) , null , null);

        vector.remove(0);
        vector.remove(0);

        node.leftNode = left;
        node.rightNode = right;

        //left and right haven't yet had their children assigned
        //queue them, so that they will be processed as soon as the
        //rest of the queue before them has been processed
        todo.add(left);
        todo.add(right);
    }
}

在此过程中,vector会被清空!!!这可以通过使用计数器而不是删除内容来避免。该算法也适用于不平衡树。基本思想是将所有节点添加到队列中。这样所有节点都可以按级别顺序处理。