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))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章