Я пытаюсь решить следующее: найти вес самого тяжелого узла в дереве и также представлять этот узел в виде списка. Это то, что я придумал, но я уверен, что это очень грязное решение. Любые советы по его эффективному использованию в рамках данного класса?Найти самый тяжелый путь в двоичном древе эффективно - python
Учитывая класс:
class Tree_node():
def __init__(self,key,val):
self.key=key
self.val=val
self.left=None
self.right=None
def __repr__(self):
return "[" + str(self.left) + " " + str(self.key) + " " + \
str(self.val) + " " + str(self.right) + "]"
рассчитать вес тяжелого пути:
def weight(node):
if node == None:
return 0
if weight(node.left)>weight(node.right):
return node.val+weight(node.left)
else:
return node.val+weight(node.right)
И тогда я пытаюсь вернуть тяжелый путь в виде списка:
def heavy_path(node):
if node==None:
return []
elif node.val+weight(node.left)> node.val+weight(node.right):
return [node.val] + filter_values(path_values(node.left))
else:return [node.val] + filter_values(path_values(node.right))
def path_values(node):
if node == None:
return 0
return [node.val,path_values(node.left),path_values(node.right)]
def filter_values (node):
values = []
sub_lists = []
if node != 0:
for value in node:
if isinstance(value, list):
sub_lists = filter_values(value)
else:
if value != 0:
values.append(value)
return values+sub_lists
Таким образом, для дерева, подобного [[None a 7 None] b 5 [[None c 8 None] d 3 None]]:
>>> weight(t)
16
>>> heavy_path(t)
[5, 3, 8]
Что было бы лучшим способом сделать это?
Рассмотрим задаю этот вопрос на [Обзор] Код (http://codereview.stackexchange.com/) –
Это выглядит так, как будто 'heavy_path()' предназначена называться рекурсивно, но я не вижу рекурсия. – Richard