我有一个如下列表。我想知道如何在Java中使用这种类型的列表创建二叉树。任何人都可以在Java中为这种类型的列表提供一些二叉树插入代码吗?
例如:
List 1: AND AND AND G M S T
二叉树将是:
AND
AND AND
G M S T
以下列表:
List 2: AND AND G M S
二叉树将是:
AND
AND S
G M
我尝试了以下插入方法:
public void insert(RDFQuery node, RDF leafValue) {
flag++;
if ((flag%2)!=0) {
if (node.left != null) {
flag--;
nodeStore=node.left;
leftFlag=1;
insert(node.left, leafValue);
}
else {
node.left = new RDFQuery(leafValue);
}
}
if ((flag%2)==0) {
if (leftFlag==1) {
node=nodeStore;
leftFlag=0;
}
if (node.right != null) {
flag--;
insert(node.right, leafValue);
}
else {
node.right = new RDFQuery(leafValue);
rightFlag=0;
}
}
}
答案 0 :(得分:1)
我不确定你想如何将你的列表变成树,因为我无法使用我能想到的任何明显的算法重现你的两个例子。
通常情况下,我会从左到右填写一个级别,然后再继续下一个级别。对于您的示例输入,这将导致以下树:
List 2: AND AND G M S
AND
/ \
AND G
/ \
M S
有多种方法可以实现这一点。一个是维护两个数字:你当前插入的行的索引(即深度)和该行中新叶子的索引。行中该索引的位模式将告诉您左右子节点的顺序,从具有最高位的根开始。深度会告诉你需要考虑多少位,即哪一位是你必须处理的最重要的位。
另一方面,元素的名称表明它们中的一些具有固定的arity。我认为AND
在所有情况下都是二元运算符,而简单符号可能是无效的。但是,通过这种解释,您的第一个示例将导致不同的列表:
AND
/ \
AND AND
/ \ / \
G M S T
AND ( AND ( G, M ), AND ( S, T ) )
List 1: AND AND G M AND S T
如果这是你的解释,那么你可能最好保持对当前节点的引用,并且在将最后一个预期的子节点添加到它之后,从父节点切换到父节点,直到到达仍然需要子节点的节点。