Поиск путей к значению в дереве

#python #binary-tree

Вопрос:

Представьте, что вы должны написать функцию, которая принимает в качестве аргументов дерево и значение x. Функция должна возвращать все пути от корня дерева к этому значению в виде списка. Если существует несколько путей, то функция возвращает список списков.

Вот что я получил до сих пор

 def path_finder(t,value):  paths = []  if label(t) == value:  return [label(t)]  for b in branches(t):  path = path_finder(b, value)  if path:  paths.append([label(t)] path)  return paths  

Однако, учитывая дерево t и значение x = 5, вот мой вывод

 t = tree(1, [tree(2, [tree(3), tree(4, [tree(6)]), tree(5)]), tree(5)])  path_finder(t,5)  [[1,[2,5]],[1,5]]  

Похоже, это проблема с укладкой.

Есть какая-нибудь помощь в отладке?

Примечание: метка(t) —gt; значение корня

Ответ №1:

Я не знаю, существует ли стандартный класс дерева, который вы используете, поэтому я его создал.

 class tree():  def __init__(self, val, sub=[]):  self.val = val  self.sub = sub # a list of trees  def label(t):  return t.val def branches(t):  return t.sub  def path_finder(t, value):  paths = []  if label(t) == value:  paths.append([value])  for b in branches(t):  paths  = [[label(t)]   path for path in path_finder(b, value)]  return paths  t = tree(1, [tree(2, [tree(3), tree(4, [tree(6)]), tree(5)]), tree(5)]) for x in range(7):  print(x, path_finder(t, x))  

Основная коррекция находится на линии paths = [[label(t)] path for path in path_finder(b, value)] . Также обратите внимание , что когда label(t) == value я не сразу возвращаю список. Остановка кода в этот момент не приведет к нахождению каждого пути, например, когда узел 5 находится под другим узлом 5.

Выход:

 # 0 [] # when path_finder cannot find the value # 1 [[1]] # 2 [[1, 2]] # 3 [[1, 2, 3]] # 4 [[1, 2, 4]] # 5 [[1, 2, 5], [1, 5]] # 6 [[1, 2, 4, 6]]