Поиск кратчайшего пути к Узлу с заданным значением — Двоичное дерево

#python #binary-tree #depth

Вопрос:

Учитывая двоичное дерево, я хотел найти глубину, на которой появляется определенное значение.

 def find_depth_of_val(self, root, val):
    if not root:
        return 10000000
    if root.val == val:
        return 0
    return 1   min(self.find_node(root.right, val), self.find_node(root.left, val))
 

Это идея, которая у меня была, вы, вероятно, увидите дикое «вернуть 10000000», которое я использовал, чтобы сделать так, чтобы, если на определенном пути больше ничего нет, т. Е. Следующий лист был достигнут, не найдя нужный нам узел, функция знала, что ответа нет, и не возвращала эту возможность.

Мне интересно, есть ли лучший способ сделать это, без использования случайного «возврата 10000000».

Редактировать: Кто-то дал мне решение, в котором я как бы меняю его на:

 def find_depth_of_val(self, root, val):
    if not root:
        return None
    if root.val == val:
        return 0
    right_side = self.find_node(root.right, val)
    left_side = self.find_node(root.left, val)
    if right_side is None:
        return left_side
    elif left_side is None:
        return right_side
    else:
        return 1   min(self.find_node(root.right, val), self.find_node(root.left, val))
 

В таком случае, как это, как я должен вводить подсказку, учитывая, что мы можем возвращать либо Нет, либо целое число?
Тем не менее, я все еще открыт для того, чтобы посмотреть, есть ли у кого-нибудь другие проекты решений!!

Комментарии:

1. Почему бы не использовать бесконечность с плавающей точкой там. Вы можете получить его с float('inf') помощью или math.inf .

2. Уникальны ли ваши ценности?

Ответ №1:

Это выглядит странно, find_depth_of_val если в качестве параметров есть и self (дерево), и root (другое дерево). Кроме того, когда вы излагаете свою проблему, вы говорите только об одном дереве и self на самом деле не используете его в своем методе.

Поэтому, если предположить, что ваши значения в дереве уникальны, вот решение. Метод возвращает None , если путь не найден или иным образом указана глубина. Optional[int] означает либо int или либо None :

 def find_depth_of_val(self, val: int) -> Optional[int]:
    if self.val == val:
        return 0
    for node in (self.left, self.right):
        if node is not None:
            depth = node.find_depth_of_val(val)
            if depth is not None:
                return depth   1
    return None