• 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
  • 相关阅读:
    系统进程
    Javascript中的常用事件
    进程信息库网址
    C#中使用临时存储过程
    Transactsql 中的 rollup 和cube的使用
    如何使用fckeditor在线编辑器(asp)
    微软将 jQuery IntelliSense整合到Visual Studio
    no such file to load openssl Anny
    Ubuntu 防火墙 ufw Anny
    Install Apache 2 from Source on Linux(转) Anny
  • 原文地址:https://www.cnblogs.com/kumata/p/9170519.html
Copyright © 2020-2023  润新知