Я участвую в 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.
мы делаем это, пока не проверим самый дальний узел.