二叉树比较节点的功能从叶子到根 Python ETE2 工具



我有一个二进制树:

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

每个节点都有"seq"特征,它存储每个节点的dna序列('AACCGGT')

同为叶子的姐妹(b,c和e,f)各得一分(float)我想要的是:

  • 将有分数的叶子的分数与它的妹妹b分数与c分数进行比较
  • d.score=最大值(b.score,c.score)

  • e、f和h 相同

  • 将a.seq与d.seq===>d和e进行比较会得到分数
  • g.score max(e.score,a.score)…直到到达根NOte:每个叶节点都有"模型特征"我根据b.model===>比较b.seq和c.seq我得到了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

l

有人能告诉我是否在考虑写作吗?注意,这是我第一次使用树数据结构和递归提前感谢您的任何建议

好的,让我们试着回顾一下递归。

执行递归函数时要写的第一件事是"退出条件"(在某个时刻终止递归的东西)。在您的情况下,退出条件应该指的是树的叶节点,它可能类似于:

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)

那么你也想要一个特殊的条件,因为它没有任何姐妹:

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(),它是应该比较两个序列的方法,并且可能会根据您的代码进行调整。但从理论上讲,这应该是几乎正确的。

最新更新