二叉搜索树(BST):如果一个二叉树满足:对于任意一个节点,其值不小于左子树的任何节点,且不大于右子树的任何节点(反之亦可),则为二叉搜索树。
BST 是一个很强大的数据结构。它允许在 O(log n) 时间内快速查找、插入和删除元素。更重要的是,BST 可以保持数据有序并且支持对 k 项数据进行区间检索而且时间复杂度是 O(k + log n)。这使得二叉搜索树成为关系型数据库管理系统的关键工具。
对基本二叉树有很多改进,我们知道的有 2-3 树、红黑树、B 树、B+ 树、B* 树。 当你用基本的二元树来思考 BST 时,学习起来就容易得多。
import numpy as np
from sklearn.linear_model import LinearRegression
from bokeh.plotting import figure, show, output_notebook
def search(node, value):
if node:
x, left, right = node
this = value == x
lsearch = value < x and search(left, value)
rsearch = value > x and search(right, value)
return this or lsearch or rsearch
def add(node, value):
if node:
x, left, right = node
this = value == x and node
ladd = value < x and (x, add(left, value), right)
radd = value > x and (x, left, add(right, value))
return this or ladd or radd
return value, None, None
def depth(node):
return node and max(depth(node[1]), depth(node[2])) + 1 or 0
def iterate(node):
if node:
x, left, right = node
yield from iterate(left)
yield x
yield from iterate(right)
data = [2, 16, 4, 2, 2, 11, 9, 0, 14, 11, 11, 9, 12, 7, 2, 12, 3, 9, 6, 12]
root = None
for value in data:
root = add(root, value)
print('depth', depth(root))
print(list(iterate(root)))
print(10, search(root, 10))
print(16, search(root, 16))