繁体   English   中英

将Tree转换为newick格式。 爪哇

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM