目前正在开发一个程序,用于激发由随机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个索引等。 我不知道如何实现这一点。
答案 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);
发生了什么,此时“跑步者”仍然等于“根”,这就是你的元素被添加到根目录的原因。