我在将二进制生根树转换为newick格式时遇到问题。 可以找到这种格式的完整说明:http://code.google.com/p/mrsrf/wiki/NewickTree
newick格式的一个例子如下:
表示{T},例如http://www.cs.mcgill.ca/~cs251/OldCourses/1997/topic8/images/completetreetwo.gif newick表示将是:(((8,9),(10,11)),((12,13),(14,15)))
内部节点将成为逗号,而将保留叶子。
这些树有内部节点,总是有两个孩子。
我使用递归来解决这个新的格式问题。 输出包含太多的节点和大括号。
任何评论都可以解决这个问题,甚至欢迎使用迭代算法
import java.util.Stack;
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();
}
}
//编辑:按照建议实施更改。 但树的所需输出是((S3,(S1,S2)),(S4,S5)) 实际输出为(((S3,((S3,(S1,S2)),(((S3,((S3,(S1,S2)),(S4,S5))
这告诉我存在逻辑错误。 也许需要有旗帜?
答案 0 :(得分:1)
也许你对理解递归有一个缺陷。您不需要“输出”参数。计算子树时,不需要先前节点的表示。像这样:
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();
}
}
答案 1 :(得分:0)
固定代码仅适用于每个节点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;
}