Рубрики
Без рубрики

Двоичное поиск в реализации дерева в Python

В этой статье мы узнаем о двоичных валках поиска. Мы изучаем основные концепции бинарных поисковых деревьев, а затем реализуйте код. Ты

Автор оригинала: Pankaj Kumar.

Двоичное поиск в реализации дерева в Python

В этой статье мы узнаем о двоичных валках поиска. Мы изучаем основные концепции бинарных поисковых деревьев, а затем реализуйте код. Вы должны быть знакомы с концепциями бинарных деревьев, чтобы прочитать эту статью.

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

Двоичное поиск – это двоичная структура данных деревьев с дополнительными свойствами наряду с свойствами двоичных деревьев. В двоичном валке поиска,

  • Там нет дублирующих ценностей.
  • Левый подделка узла имеет все значения данных меньше, чем собственные данные. I.e. Левый ребенок или дети левого ребенка всегда меньше, чем значение в текущем узле.
  • Правильный подметку узла имеет все значения данных, превышающие его собственные данные. I.e. Правильный ребенок или дети правого ребенка нынешнего узла всегда больше, чем текущий узел.

Это можно наблюдать в следующем примере.

Askpython31.

Реализация двоичного дерева поиска в Python

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

class BinaryTreeNode:
  def __init__(self, data):
    self.data = data
    self.leftChild = None
    self.rightChild=None

Теперь, чтобы реализовать двоичное поиск, мы реализуем функции, чтобы вставить значение в дереве, искать значение в двоичном дереве, а затем мы увидим, как найти минимальные и максимальные элементы из дерева двоичного поиска.

Вставка узла в двоичном дереве поиска

Вставляя узел в двоичном дереве поиска, может возникнуть три условия.

  1. Двоичное поисковое дерево может быть пустой. I.e. Сам корень будет иметь значение None None.
  2. Значение, которое нужно вставить меньше корня.
  3. Значение, которое нужно вставить, больше корня.

Для реализации первого условия мы просто делаем новый узел и объявляем его как root. Для реализации второго и третьего условия мы следуем следующему подходу.

Из свойств двоичного дерева поиска мы видим, что каждое подвигание – это двоичное поиск сама по себе. Таким образом, мы можем рассмотреть каждый узел как корень другого двоичного дерева.

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

Рекурсивно продолжается, мы всегда будем достичь первого состояния, а затем мы объявим новый узел и добавим узел в двоичное поиск.

Ниже приведена реализация вышеуказанного подхода.

class BinaryTreeNode:
  def __init__(self, data):
    self.data = data
    self.leftChild = None
    self.rightChild=None
    
def insert(root,newValue):
    #if binary search tree is empty, make a new node and declare it as root
    if root is None:
        root=BinaryTreeNode(newValue)
        return root
    #binary search tree is not empty, so we will insert it into the tree
    #if newValue is less than value of data in root, add it to left subtree and proceed recursively
    if newValue

Выход:

Root Node is:
15
left child of node is:
10
right child of node is:
25
Node is:
10
left child of node is:
6
right child of node is:
14
Node is:
25
left child of node is:
20
right child of node is:
60
Node is:
6
left child of node is:
None
right child of node is:
None
Node is:
14
left child of node is:
None
right child of node is:
None
Node is:
20
left child of node is:
None
right child of node is:
None
Node is:
60
left child of node is:
None
right child of node is:
None

В вышеуказанном выходе мы можем проверить каждое свойство двоичного дерева поиска в нашем примере. Здесь, после объявления корневого узла, независимо от того, какой порядок введения элементов там, выход всегда будет одинаковым. Попробуйте это, скопировав и вставляя этот код в свой собственный Python IDE.

Поиск элемента в двоичном дереве поиска

Мы видели выше, что узел со значением меньше, чем значение текущего значения узла, всегда будет в левом подкорении текущего узла и узла со значением, превышающим значение значения текущего узла, всегда будет в правом поддереве. текущего узла. Мы будем использовать это свойство для поиска элемента в двоичном дереве поиска.

  1. Если текущий узел становится пустым, то есть нет, элемент для поиска не присутствует на дереве, и мы вернемся False.
  2. Если текущий узел имеет значение, равное поисковому запросу, мы вернемся.
  3. Если значение для поиска большее, чем значение текущего узла, мы будем искать правильный поддельный узел текущего узла.
  4. Если значение для поиска меньшее значение текущего узла, мы будем искать влево поддерево текущего узла

Реализация логики приведена ниже.

class BinaryTreeNode:
  def __init__(self, data):
    self.data = data
    self.leftChild = None
    self.rightChild=None
    
def insert(root,newValue):
    #if binary search tree is empty, make a new node and declare it as root
    if root is None:
        root=BinaryTreeNode(newValue)
        return root
    #binary search tree is not empty, so we will insert it into the tree
    #if newValue is less than value of data in root, add it to left subtree and proceed recursively
    if newValue

Выход:

True
False

Как найти максимальный элемент двоичного дерева поиска?

От всего, что мы видели до сих пор, мы знаем, что элемент, превышающий текущий узел, всегда находится на правой стороне.

Когда мы переходим к правильному ребенку каждого узла, начиная с Root до конца рекурсивно, наибольший элемент присутствует в конце.

Итак, чтобы найти самый большой элемент двоичного дерева поиска, нам просто нужно найти самый правый элемент дерева. Вот реализация этой логики.

class BinaryTreeNode:
  def __init__(self, data):
    self.data = data
    self.leftChild = None
    self.rightChild=None
    
def insert(root,newValue):
    #if binary search tree is empty, make a new node and declare it as root
    if root is None:
        root=BinaryTreeNode(newValue)
        return root
    #binary search tree is not empty, so we will insert it into the tree
    #if newValue is less than value of data in root, add it to left subtree and proceed recursively
    if newValue

Выход:

Largest Element is:
60

Как найти наименьший элемент двоичного поиска дерева поиска?

Мы знаем, что элемент меньшее, чем текущий узел, всегда находится на левой стороне. Когда мы переходим к левому ребенку каждого узла, начиная от root до конца рекурсивно, наименьший элемент будет присутствовать в последнем.

Итак, чтобы найти наименьший элемент двоичного дерева поиска, нам просто нужно найти левый элемент дерева. Вот реализация этой логики.

class BinaryTreeNode:
  def __init__(self, data):
    self.data = data
    self.leftChild = None
    self.rightChild=None
    
def insert(root,newValue):
    #if binary search tree is empty, make a new node and declare it as root
    if root is None:
        root=BinaryTreeNode(newValue)
        return root
    #binary search tree is not empty, so we will insert it into the tree
    #if newValue is less than value of data in root, add it to left subtree and proceed recursively
    if newValue

Выход:

Smallest Element is:
6

Заключение

В этой статье мы видели базовые концепции позади двоичных валков поиска. Мы также внедрили различные операции, такие как вставка, поиск, нахождение максимального элемента и нахождение минимального элемента в двоичном дереве поиска.

Я бы побудил вас реализовать коды и играть с ними. Оставайтесь настроиться на более информативные учебные пособия.

Счастливое обучение.