2013-08-19 36 views
1

我有b * inary樹 *其中只有葉子有字符串值(A,B,C,d,E) 我想C * oncatenate的這些葉子的值,並把它傳遞給他們的祖先 *蟒蛇ete2二叉樹得到後人的和值

 0 
    / \ 
    2  3 
/\ /\ 
    1 a d e 
/\ 
b c 

如。

1->value=bc 2->value=abc 3->value=de 

什麼是蟒蛇藉此在此提前

回答

2

一個非常標準的程序ete2 tree class

由於是使用後序迭代的最好方式。另外,ETE也實現了get_cached_content函數,這有利於這種類型的計算。

from ete2 import Tree 
t = Tree("(((b,c), a), (d,e));") 

print "Method 1: caching node content" 
internal_node_content = t.get_cached_content(store_attr="name") 
for node, content in internal_node_content.iteritems(): 
    if not node.is_leaf(): 
     print node, "\nConcat:", ''.join(content) 


print "Method 2: post order iteration" 
node2concat = {} 
for node in t.traverse("postorder"): 
    if not node.is_leaf(): 
     concat = ''.join([node2concat[ch] for ch in node.children]) 
     node2concat[node] = concat 
     print node, "\nConcat:", concat 
    else: 
     node2concat[node] = node.name 


#Method 1: caching node content 
# 
#   /-b 
#  /-| 
# /-| \-c 
# | | 
#--| \-a 
# | 
# | /-d 
# \-| 
#  \-e 
#Concat: acbed 
# 
# /-b 
#--| 
# \-c 
#Concat: cb 
# 
#  /-b 
# /-| 
#--| \-c 
# | 
# \-a 
#Concat: acb 
# 
# /-d 
#--| 
# \-e 
#Concat: ed 
#Method 2: post order iteration 
# 
# /-b 
#--| 
# \-c 
#Concat: bc 
# 
#  /-b 
# /-| 
#--| \-c 
# | 
# \-a 
#Concat: bca 
# 
# /-d 
#--| 
# \-e 
#Concat: de 
# 
#   /-b 
#  /-| 
# /-| \-c 
# | | 
#--| \-a 
# | 
# | /-d 
# \-| 
#  \-e 
#Concat: bcade