[英]converting a Tree to newick format. java
我在将二叉根树转换为newick格式时遇到问题。 可以找到这种格式的完整说明: http : //code.google.com/p/mrsrf/wiki/NewickTree
newick格式的示例如下:
对于诸如http://www.cs.mcgill.ca/~cs251/OldCourses/1997/topic8/images/completetreetwo.gif这样的树T,newick表示为:((((8,9),(10,11 )),(((12,13),(14,15)))
内部节点将成为逗号,而叶子将被保留。
这样的树有内部节点,该节点将始终有2个子节点。
我在使用递归来解决这种newick格式时遇到问题。 输出包含太多的节点和花括号。
任何解决此问题的意见都将受到赞赏,甚至将欢迎使用迭代算法
import java.util.Stack;
public class Tree { ....
public class Tree { ....
public String inOrderNewick(Node root, String output) throws ItemNotFoundException { if (root.hasChild()) { output += "("; output += inOrderNewick(root.child1, output); output += ","; output += inOrderNewick(root.child2, output); output += ")"; return output; } else { return root.getSeq(); }
}
// edit:按照建议实施更改。 但一棵树的期望输出是[[S3,(S1,S2)),(S4,S5)),其中实际输出是[[(S3,((S3,(S1,S2)),(((S3 ,(((S3,(S1,S2)),(S4,S5))
这告诉我存在逻辑错误。 也许需要标记?
也许您在理解递归方面有缺陷。 您不需要“输出”参数。 计算子树时,不需要先前节点的表示。 使它像这样:
public String inOrderNewick(Node root) throws ItemNotFoundException {
if (root.hasChild()) {
String output = "";
output += "(";
output += inOrderNewick(root.child1);
output += ",";
output += inOrderNewick(root.child2);
output += ")";
return output;
} else {
return root.getSeq();
}
}
固定代码仅适用于每个节点0或2个子代的树。
这应该适用于任意二叉树+添加分支距离参数:
BinaryTree left;
BinaryTree right;
double ldist;
double rdist;
String label;
//...
public String toNewick(){
if(right==null && left==null){
return label.toString();
}
String output = "(";
if(right!=null){
output+=right.toNewick()+":"+rdist;
}
if(right!=null && left!=null){
output+=",";
}
if(left!=null){
output+=left.toNewick()+":"+ldist;
}
output += ")";
return output;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.