python數據結構之樹(二分查找樹)


本篇學習筆記記錄二叉查找樹的定義以及用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM