arrayList树排序&添加二进制代码字符串

时间:2011-12-10 05:43:40

标签: java arraylist

目前正在开发一个程序,用于激发由随机0和1组成的字符串arrayList构成的树。 每个节点都限制它可以存储多少个值,并且根始终使用第一个node.size值填充。之后的任何值都需要转到左或右子(取决于它是否为值0或1)0 =左1 =右。随着树的增长,每个级别都会根据树的高度来评估。

NODE CLASS

public class Node {
    public ArrayList<String> elements;
    public Node leftC;
    public Node rightC;
    private String data;
    int size = 5; //size limit of the Arraylist in each node


    public Node(s){
        elements = new ArrayList<String>();
        elements.add(s);
    }

    public void addString(String s){
        elements.add(s);
    }
}

TREE CLASS

public void insert(String s){

    root = insert(root,s);
}
private Node insert(Node n, String s){

    if (n == null){
        n = new Node(s);
    } else if (!n.isFull()){
        n.addString(s);
    } else {
        if (s.charAt(0) == '0'){
            n.leftC = insert(n.leftC,s);
        } else if (s.charAt(0) == '1'){
            n.rightC = insert(n.rightC,s);
        }
    }
    return (n);
}

修改 感谢您的输入,我接受了建议,并实现了一个递归函数来执行此操作。 树现在正在工作......它正确地将第一个Node.size值添加到arraylist并将其余的值基于0或1发送给它的子项。

Example:
Root node:
[1011001001, 1011101101, 1111011011, 1011011101, 0101111011]

Left Child Node [0111001000, 0111111111, 0010101010, 0100000000, 0011010000]
Right Child Node [1111011111, 1011010110, 1001101000, 1000001110, 1110000000]

然而,这是我遇到一个新问题,我完全陷入困境。

如果我去评估这些新节点的L和R子...似乎因为它继续评估charAt索引0的值,它只是制作一个三角形的树

right child @ right [1100000011, 1100000000, 1011100000, 1011011011, 1010101010]
left child @ right - none
right child @ left - none
left child @ left [0010010101, 0010101011, 0110000100, 0011000000, 0010110111]

我的问题是..我将如何评估要评估的charAt索引与树的高度有关?

例如..如果我的树正确完成了第一层之后的下一层节点(评估charAt索引1而不是0)

right child @ right [1100000011, 1100000000]
left child @ right [1011100000]

right child @ left [0110000100, 0111001000]
left child @ left [0010010101, 0010101011, 0011000000,0010110111,0001110000]

因此,当我们继续并且树在每个节点填满时,我们将评估它@第3个索引等。 我不知道如何实现这一点。

2 个答案:

答案 0 :(得分:0)

您的基本问题是,在选择左或右路径后,您没有将runner设置到相应的左或右节点。

特别是这段代码:

            } else if (runner.leftC==null){
                runner.leftC = new Node();
                runner.addString(s);
                System.out.println("ADDED "+s+" to step 2 LEFT");
                return;
            } 

您将字符串添加到上一个节点,而不是刚才创建的字符串。

如果您在Node上使用递归方法,则不太可能出现此错误。

答案 1 :(得分:0)

两个不合适的地方(010110010001&amp; 110100111111)是唯一添加了“第2步”字符串的地方,所以你的问题必须在那里。

从它的外观来看,你将“跑步者”设置为“根”:

Node runner;
runner = root;

然后你要添加字符串:

runner.leftC = new Node();
runner.addString(s);

发生了什么,此时“跑步者”仍然等于“根”,这就是你的元素被添加到根目录的原因。