Я ищу алгоритм, который преобразует мою двоичную древовидную структуру: из моего собственного класса, где каждый узел имеет node.value, node.leftChild и node.rightChild. Я хочу преобразовать это дерево в формат Newick, поэтому нужно преобразовать только листья и структуру дерева.преобразовать дерево в строку, которая содержит только листья
дерево как enter image description here должно стать (B, (E, F)) (так без внутренних узлов)
Я думаю, что лучший способ это траверс моего дерева рекурсивно и построить строку, но у меня всегда есть ошибки для конкретных деревьев.
class binarynode(object):
def __init__(self, value, left = None, right = None,parent =None):
self.parent = parent
self.value = value
self.left = left
self.right = right
def isleaf(self):
return ((self.right == None) and (self.left ==None))
def convertTReeAux(self):
printValue = str(self.value)
if (self.isleaf() and self.parent == None):
ret = '('+printValue+')'
elif (self.isleaf() and (self.parent.left.value == self.value) and (self.parent.right.isleaf())) :
ret = '('+str(printValue)+','
elif (self.isleaf() and self.parent.right.value==self.value and self.parent.left.isleaf() and self.parent.parent !=None and self.parent.parent.right == self.parent):
ret = str(printValue)+'))'
elif (self.isleaf() and self.parent.right.value==self.value and self.parent.left.isleaf()):
ret = str(printValue)+')'
elif (self.isleaf() and (self.parent.left.value == self.value) and (not self.parent.right.isleaf())):
ret = '('+str(printValue)+','
elif (self.isleaf() and self.parent.right.value ==self.value and (not self.parent.left.isleaf())):
ret = ','+str(printValue)+')'
elif((not self.isleaf()) and (self.parent!= None) and (self.parent.left == self) and (not self.parent.right.isleaf())):
ret = ""
elif((not self.isleaf()) and (self.parent!= None) and (self.parent.right ==self) and (not self.parent.left.isleaf())):
ret="),"
elif((not self.isleaf()) and (self.parent!= None) and (self.parent.left ==self) and (not self.parent.left.isleaf())):
ret="("
else:
ret = ''
if(self.left != None):
ret += (self.left.convertTReeAux())
if(self.right != None):
ret += (self.right.convertTReeAux())
return ret
сделать вопрос более конкретным, пожалуйста, покажите нам код, достигнутый до сих пор – Yunhe
@Yunhe я добавил к грязному коду с большим количеством, если тесты, потому что я хочу, чтобы покрыть все возможные пары соединений. например лист и лист или лист и узел, .... –
Не могли бы вы предоставить структуру данных дерева, которое вы хотите преобразовать? – Yunhe