Двоичное дерево поиска (BST) – это базовое упорядоченное двоичное дерево, в котором элементы хранятся в определенном порядке, что позволяет эффективно выполнять несколько операций над элементами.
Свойства BST:
- Левое поддерево узла содержит узлы с ключами меньше, чем ключ узла.
- Правое поддерево узла содержит узлы с ключами, большими, чем ключ узла.
- Каждое из левого и правого поддеревьев должно быть бинарным деревом поиска.
- Двоичное дерево поиска не работает с повторяющимся ключом.
Пример BST:
Работа BST:
Algorithm Average Worst ======================================= Space O(n) O(n) Insert O(n lg n) O(n) Search O(n lg n) O(n) Delete O(n lg n) O(n)
Поиск ключа:
static class Node { int key; Node left, right; public Node() {} public Node(int key) { this.key = key; } } private Node searchNode(Node node, int key) { if(null == node || node.key == key) return node; if(key < node.key) return searchNode(node.left, key); else return searchNode(node.right, key); }
Вставка ключа:
private Node insertNode(Node node, int key) { if(null == node) return new Node(key); if(key < node.key) node.left = insertNode(node.left, key); else node.right = insertNode(node.right, key); return node; }
Удаление ключа:
private Node deleteNode(Node node, int key) { if(null == node) return node; if (key < node.key) node.left = deleteNode(node.left, key); else if(key > node.key) node.right = deleteNode(node.right, key); else { // Node with one child or no child if (null == node.left) return node.right; if (null == node.right) return node.left; Node temp = inorderSuccessor(node.right); node.key = temp.key; node.right = deleteNode(node.right, temp.key); } return node; } private Node inorderSuccessor(Node node) { Node current = node; while(null != current.left) current = current.left; return current; }