二叉树比较从叶到根python ete2工具的节点特征

时间:2013-08-21 07:26:56

标签: python python-2.7 recursion comparison binary-tree

我有一棵二叉树:

       root
     /     \
    g      h
   / \    / \
 d   a   e   f
 / \
b   c

每个节点都有'seq'功能,用于存储每个节点('AACCGGT')

的dna序列 两个都是叶子的姐妹(b,c和e,f)每个都有一个得分(浮动) 我想要的是:

  • 将得分的叶子与其姐妹b.score与c.score
  • 进行比较
  • d.score = max(b.score,c.score)

  • 同样适用于e,f和h

  • 比较a.seq与d.seq ==> d和e将得分
  • g.score max(e.score,a.score)......直到到达根 注意:每个叶节点都有'模型特征'我比较b.seq和c.seq基于b.model ==>我得到了b.score然后基于c.model ==>我得到了c.score

我写的这个函数但是我不确定它是否符合我的要求而我无法测试它因为我还没有align_trna函数

def affect_score(n):

if (n.score)==0:
            n.score,n.model=affect_score(n.get_children()[0])
        result=n.score
        model=n.model
        if not n.is_root():
            sis=n.get_sisters()[0]
            if sis.score==0:
                sis.score,sis.model=affect_score(sis.get_children()[0])
                n.score=align_trna(n.seq,sis.seq,n.model)
                sis.score,sis.model= align_trna(nseq, sis.seq,sis.model)
                if n.score < sis.score:
                        result=sis.score
                        model=sis.model

        return result,mode

1

任何人都可以通过告诉我是否在想写作来帮助我吗? 请注意,这是我第一次使用树数据结构和递归 提前感谢任何建议

1 个答案:

答案 0 :(得分:2)

好的,让我们回顾一下有关递归的事情。

执行递归函数时要写的第一件事是“退出条件”(在某些时候终止递归的东西)。 在您的情况下,退出条件应该引用树的叶节点,它将类似于:

if len(n.get_childreen())==0:
    return n.score

然后对于每个其他节点,你应该进行计算:

child_score = max(affect_score(n).get_children()[0], affect_score(n).get_children()[1])
seq = compare_seq(n.seq, n.get_sisters()[0].seq)
n.score = max(child_score, seq)

然后你也想在root上有一个特殊条件,因为它没有任何姐妹:

if n.is_root():
   n.score = max(affect_score(n).get_children()[0], affect_score(n).get_children()[1])

最后应该看起来像:

def affect_score(n):
    if len(n.get_childreen())==0:
        return n.score
    if n.is_root():
       n.score = max(affect_score(n).get_children()[0], affect_score(n).get_children()[1])
    else:
       child_score = max(affect_score(n).get_children()[0], affect_score(n).get_children()[1])
       seq = compare_seq(n.seq, n.get_sisters()[0].seq)
       n.score = max(child_score, seq)

这就是我理解你想做的事情!您需要添加compare_seq(),这是应该比较两个序列的方法,并可能适应您的代码。但理论上它应该几乎是正确的。