Я немного схожу с ума.
Моя цель очень проста. В двоичном дереве укажите узел и верните путь к этому узлу в виде списка. Доступен ряд реализаций.
Здесь - одна из лучших и наиболее простых:
def path(root, k):
if not root:
return []
if root.val == k:
return [root.val]
res = path(root.left, k)
if res:
return [root.val] + res
res = path(root.right, k)
if res:
return [root.val] + res
return []
Из чисто образовательных соображений я решил переписать его с вспомогательная функция, в которой я передаю пустой список и рекурсивно добавляю в него элементы.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def path2Node2(self, root, node2):
if not root:
return None
def _helper(root, node, paths):
if not root:
return []
if root.val == node.val:
paths.append(root.val)
return paths
return _helper(root.left, node, paths + [root.val])
return _helper(root.right, node, paths + [root.val])
return _helper(root, node2, [])
if __name__ == '__main__':
l = TreeNode(10)
l.left = TreeNode(8)
l.right = TreeNode(2)
l.left.left = TreeNode(3)
l.left.right = TreeNode(5)
l.right.left = TreeNode(4)
print(l.path2Node2(l, l.left))
Он работает, если я передаю узел root ( print (l.path2Node2 (l, l) ).
Это работает, если я передаю левый дочерний элемент ( print (l.path2Node2 (l, l.left)) )
Но если я прохожу l.left.right или l.right.left, он возвращает [].
Я не могу понять это последние несколько часов. Что мне не хватает?