Двоичное дерево поиска (BST) — это структура данных, позволяющая эффективно искать и вставлять элементы. Он работает путем организации данных в виде древовидной структуры, где каждый узел имеет не более двух дочерних элементов. Левый дочерний элемент узла содержит значение, меньшее, чем родительский узел, а правый дочерний элемент содержит большее значение.

Чтобы реализовать BST в Swift, нам сначала нужно создать класс узла, который будет представлять каждый элемент в дереве. Каждый узел должен иметь значение и ссылку на его левый и правый потомки. Мы можем сделать это, создав класс Node с тремя свойствами:

class Node {
  var value: Int
  var left: Node?
  var right: Node?

  init(value: Int) {
    self.value = value
  }
}

Далее нам нужно создать класс BST, который будет хранить корневой узел дерева и предоставлять методы для вставки и поиска элементов. Мы можем сделать это, создав класс под названием «BinarySearchTree» с двумя методами: «insert» и «search».

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

class BinarySearchTree {
  var root: Node?

  func insert(value: Int) {
    let newNode = Node(value: value)

    if root == nil {
      root = newNode
      return
    }

    var currentNode = root
    while currentNode != nil {
      if value < currentNode!.value {
        if currentNode?.left == nil {
          currentNode?.left = newNode
          return
        }
        currentNode = currentNode?.left
      } else {
        if currentNode?.right == nil {
          currentNode?.right = newNode
          return
        }
        currentNode = currentNode?.right
      }
    }
  }

Метод «поиск» примет значение и вернет логическое значение, указывающее, присутствует ли значение в дереве. Мы можем сделать это, пройдя по дереву аналогично методу вставки. Если значение найдено, мы возвращаем «true». Если мы достигаем конечного узла и значение не найдено, мы возвращаем «false».

func search(value: Int) -> Bool {
    var currentNode = root
    while currentNode != nil {
      if value < currentNode!.value {
        currentNode = currentNode?.left
      } else if value > currentNode!.value {
        currentNode = currentNode?.right
      } else {
        return true
      }
    }
    return false
  }
}

Теперь, когда у нас есть реализованный класс BST, мы можем создать новый экземпляр и вставить в него некоторые значения. Например:

let bst = BinarySearchTree()
bst.insert(value: 5)
bst.insert(value: 3)
bst.insert(value: 7)
bst.insert(value: 2)