Я участвую в 30-дневном соревновании по программированию на Python, и в этой статье я попытаюсь выяснить, является ли бинарное дерево бинарным деревом поиска.

Что такое бинарное дерево?

  • дерево, в котором каждый узел имеет не более 2 дочерних элементов

Что такое бинарное дерево поиска?

  • Значение каждого узла в левом поддереве узла меньше значения данных этого узла.
  • Значение каждого узла в правом поддереве узла больше, чемзначение данных этого узла.

Я также рассмотрел структуры данных, в частности, деревья/обход дерева в предыдущей статье:



Проблема:



Решение:

######################### SOLUTION I #########################################
def is_binary_search_tree(root):
    """
    Determines whether a binary tree is a binary search tree.

    Args:
        root: The root node of the binary tree.

    Returns:
        True if the binary tree is a binary search tree, False otherwise.
    """

    def is_bst_helper(node, min_val, max_val):
        if node is None:
            return True

        if node.value < min_val or node.value > max_val:
            return False

        return (is_bst_helper(node.left, min_val, node.value-1) and
                is_bst_helper(node.right, node.value+1, max_val))

    return is_bst_helper(root, float('-inf'), float('inf'))


######################### SOLUTION II #########################################

def check_binary_search_tree(root):
    """
    Determines whether a binary tree is a binary search tree.

    Args:
        root: The root node of the binary tree.

    Returns:
        True if the binary tree is a binary search tree, False otherwise.
    """
    if root == None:
        return True
    else:
        if root.left:
            leftData = traversingTree(root.left,[])
            if root.data <= max(leftData):
                return False
        if root.right:
            rightData = traversingTree(root.right,[])
            if root.data >= min(rightData):
                return False
            return (is_binary_search_tree(root.left, min_val, root.data) and \\
            is_binary_search_tree(root.right, root.data, max_val))

def traversingTree(root, datas):
  """
  Used to travers the tree both on the left side and on the right branch.
  
  """
    if root == None:
        return
    else:
        datas.append(root.data)
        traversingTree(root.left,datas)
        traversingTree(root.right,datas)
        return datas

Объяснение и заключение:

Решение I:

Эта версия кода принимает те же аргументы, что и функция is_bst_helper, со значениями по умолчанию отрицательная бесконечность и положительная бесконечность для min_val и max_val соответственно.

Что для первой итерации, конечно, означает, что вы никогда не найдете меньшее или большее значение для min_val или max_val.

Сначала функция проверяет, находится ли атрибут data узла root в пределах допустимого диапазона, определенного min_val и max_val.

Если нет, функция возвращает False.

В противном случае функция рекурсивно проверяет левое и правое поддеревья текущего узла, чтобы убедиться, что они также удовлетворяют Требования к упорядочению бинарного дерева поиска.

Если и левое, и правое поддеревья являются бинарными деревьями поиска, функция возвращает True.

В противном случае функция возвращает False.

Решение II:

Для второго решения логика такая же, однако мы будем рекурсивно и одновременно проходить каждую ветвь дерева, начиная с корневого узла.

Если мы находим какой-либо левый узел больше, чем узел данных, мы возвращаем False.

Если мы находим какой-либо правый узел меньше, чем узел данных, мы возвращаем False.

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

Спасибо за чтение и за вашу поддержку.

Не забудьте подписаться на меня в Medium или LinkedIn.