Похоже, у вас это почти получилось, но рассмотрим пример:
4
3 5
Когда вы проследите через MinBranch
, вы увидите это в своем
MinBranch(l,r,4)
Звоните:
left_one = MinBranch(l, r, l(x))
= MinBranch(l, r, l(4))
= MinBranch(l, r, 3)
= 0
Это имеет смысл, в конце концов, 3 - это листовой узел, поэтому, конечно, расстояние
до ближайшего конечного узла равно 0. То же самое происходит для right_one.
Но тогда вы окажетесь здесь:
return {min (left_one),(right_one)}
= {min (0), (0) }
= 0
но это явно не так, потому что этот узел (4) не является листовым узлом. Ваш
Код забыл сосчитать текущий узел (упс!). Я уверен, что вы можете управлять
чтобы исправить это.
Теперь, на самом деле, то, как ты это делаешь, не самое быстрое, но я не
уверен, что это актуально для этого упражнения. Посмотрите на это дерево:
4
3 5
2
1
Ваш алгоритм будет рекурсивно подсчитывать левую ветвь, даже если он
может, гипотетически, выручить, если вы сначала посчитали правильную ветвь
и отметил, что 3 имеет левый, поэтому его явно больше, чем 5 (который является
лист). Но, конечно, подсчет правильной ветви не всегда
работа!
Вместо этого, с более сложным кодом и, вероятно, компромиссом большего
Использование памяти, вы можете проверить узлы слева направо, сверху вниз (просто
как порядок чтения на английском) и остановитесь на первом листе, который найдете.