Моя функция BST для поиска максимального элемента левого поддерева и минимального элемента правого поддерева не будет возвращать значения

#python-3.x #binary-search-tree

Вопрос:

Это моя функция для возврата максимального элемента левого поддерева и минимального элемента правого поддерева

 def Max(root):#this will return maximum element of left subtree
    if  root.left and not root.right:
        return root.data
    if root.right:
        Max(root.right)
    else:
        Max(root.left)
def Min(root):#this will return minimum element of right subtree
    if not root.left and not root.right:
        return root.data
    if root.left:
        Min(root.left)
    else:
        Min(root.right)
def InorderPreSuc(root):
    pre=Max(root.left)
    suc=Min(root.right)
    print(' predecessor {} and successor {}.format(pre,suc))
 

Но моя функция не возвращает значения, почему?

Ответ №1:

Максимумом левого поддерева будет нахождение максимума в root.left, аналогично минимумом правого поддерева будет минимум root.right

Чтобы рекурсивно найти минимум или максимум:

 # Max of a BST would be its rightmost element
def Max(root):
    if root.right is not None:
        Max(root.right)
    return root.data

# Min of BST would be its leftmost element
def Min(root):
    if root.left is not None:
        Min(root.left)
    return root.data
 

Теперь, чтобы найти максимум левого поддерева, вызовите Max(root.left).
Мы можем добавить еще одну проверку на нулевое значение в случае, если корень равен нулю.

 def Min(root):
    if root is None:
        return float("-inf")
    if root.left is not None:
        Min(root.left)
    return root.data
 

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

1. можете ли вы сказать мне, что не так с моим кодом, потому что, если я использую инструкцию print внутри функции, необходимый вывод получается, но он не возвращает значение, что я имею в виду, если я печатаю root. данные внутри функции max и min я получаю вывод, но функция их не возвращает

2. Учитывая мою реализацию, нет никакой разницы, печатаете вы значение или возвращаете его. Функция рекурсивно переходит к крайнему левому (или крайнему правому дочернему элементу), что дает нам узел с минимальным (или максимальным) значением, содержащим узел. Затем вы можете делать с этим узлом все, что пожелаете — печатать его, возвращать, менять местами, увеличивать/уменьшать. Важная часть состоит в том, чтобы перейти к крайнему левому или крайнему правому дочернему элементу, чтобы получить нужный узел.