Python_算法实现_(12)二叉搜索树(BST)

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))

你可能感兴趣的:(Python算法,二叉树,数据库,python,算法)