1. 二叉搜索樹
二叉搜索樹(BST):如果一個二叉樹滿足:對於任意一個節點,其值不小於左子樹的任何節點,且不大於右子樹的任何節點(反之亦可),則爲二叉搜索樹。
BST 是一個很強大的數據結構。它允許在 O(log n) 時間內快速查找、插入和刪除元素。更重要的是,BST 可以保持數據有序並且支持對 k 項數據進行區間檢索而且時間複雜度是 O(k + log n)。這使得二叉搜索樹成爲關係型數據庫管理系統的關鍵工具。
對基本二叉樹有很多改進,我們知道的有 2-3 樹、紅黑樹、B 樹、B+ 樹、B* 樹。 當你用基本的二元樹來思考 BST 時,學習起來就容易得多。
- 2-3 樹是一個幾乎完全平衡的 BST
- LLRB 樹是具有路徑着色約束的 2-3 樹的 BST 實現
- RB 樹是具有路徑着色約束的 2-3-4 樹的 BST 實現
- B 樹是一個完全平衡的 BST 與子樹塊對齊
2.實現
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))