本篇學習筆記記錄二叉查找樹的定義以及用python實現數據結構增、刪、查的操作。
二叉查找樹(Binary Search Tree)
簡稱BST,又叫二叉排序樹(Binary Sort Tree),是對稱順序的二叉樹,支持多種動態集合操作。
二叉樹也是:
- 空
- 兩個不相交的二叉樹(左和右)
對稱順序
- 每個節點都有一個密鑰,每個節點的密鑰都是
- 大於其左側子樹中的所有密鑰
- 小於其右側子樹中的所有密鑰
BST 用Python表示
BST是對根節點的引用
節點由四個字段組成
- 一個 Key 和 一個 Value
- 對左子樹(較小的密鑰)和右子樹(較大的密鑰)的引用
class Node(object): __slots__ = '_item' , '_lchild' , '_rchild' def __init__ (self, item, lchild=None, rchild=None): self._item = item self._lchild = lchild self._rchild = rchild
BST操作方法
- BST 搜索
- BST 插入
- BST獲取最小值與最大值
- BST 刪除
BST 搜索
- 獲取:返回給定鍵對應的值;如果沒有這樣的鍵,則返回null
- 成本:比較的數量等於1 +節點的深度
# Get樹元素的方法 def get(self, key): return self.__get(self._root, key); def __get(self, node, key): # helper if (node is None): return None if (key == node._item): return node._item if (key < node._item): return self.__get(node._lchild, key) else: return self.__get(node._rchild, key)
BST 插入
添加:將關聯值與關鍵字關聯
搜索密鑰,然后搜索兩個案例
- 鍵入樹⇒重置值
- 密鑰不在樹中⇒添加新節點
成本:比較的數量等於1 +節點的深度
# add元素的方法 def add(self, value): self._root = self.__add(self._root, value) def __add(self, node, value): # return node ,helper if (node is None): return Node(value) if (value == node._item): pass else: if (value < node._item): node._lchild = self.__add(node._lchild, value) else: node._rchild = self.__add(node._rchild, value) return node
BST 刪除
最復雜的二叉搜索樹操作
我們必須確保當我們移除一個元素時,我們維護二叉 搜索樹屬性
刪除最小密鑰
- 向左移動直到找到帶有空左鏈接的節點
- 用正確的鏈接替換該節點
- 更新子樹計數
# remove樹元素的方法 def remove(self, key): self._root = self.__remove(self._root, key) def __remove(self, node, key): # helper if node is None: return None if (key < node._item): node._lchild = self.__remove(node._lchild, key) elif (key > node._item): node._rchild = self.__remove(node._rchild, key) else: if (node._lchild is None): node = node._rchild # if rchild is None, node = None; case 1: no child # if rchild is not None, node = node._rchild; case 2: one child elif (node._rchild is None): node = node._lchild else: node._item = self.__get_max(node._lchild) node._lchild = self.__remove(node._lchild, node._item) return node
BST獲取最小值與最大值
# get max 元素的方法 def get_max(self): return self.__get_max(self._root) def __get_max(self, node): # helper if (node is None): return None while (node._rchild is not None): node = node._rchild return node._item