本篇学习笔记记录二叉查找树的定义以及用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

python数据结构之树(二分查找树)的更多相关文章

  1. 手把手教你用java实现二分查找树及其相关操作

    二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...

  2. Go 数据结构--二分查找树

    Go 数据结构--二分查找树 今天开始一个Go实现常见数据结构的系列吧.有时间会更新其他数据结构. 一些概念 二叉树:二叉树是每个节点最多有两个子树的树结构. 完全二叉树:若设二叉树的高度为h,除第 ...

  3. Python与数据结构[3] -> 树/Tree[1] -> 表达式树和查找树的 Python 实现

    表达式树和查找树的 Python 实现 目录 二叉表达式树 二叉查找树 1 二叉表达式树 表达式树是二叉树的一种应用,其树叶是常数或变量,而节点为操作符,构建表达式树的过程与后缀表达式的计算类似,只不 ...

  4. lintcode-106-排序列表转换为二分查找树

    106-排序列表转换为二分查找树 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例 标签 递归 链表 思路 类似于二分查找,每次将链表二分,中间节点作为根节点,在建立左子树 ...

  5. 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)

    议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...

  6. 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers

    题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...

  7. 【数据结构】关于前缀树(单词查找树,Trie)

    前缀树的说明和用途 前缀树又叫单词查找树,Trie,是一类常用的数据结构,其特点是以空间换时间,在查找字符串时有极大的时间优势,其查找的时间复杂度与键的数量无关,在能找到时,最大的时间复杂度也仅为键的 ...

  8. SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)

    题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,0 ...

  9. Python 数据结构与算法 —— 哈弗曼树

    1. 从扩充二叉树到哈弗曼树 扩充二叉树:对二叉树 T,加入足够多的新叶节点(而不是任意),使 T 的原有结点都变成度数为 2 的分支节点,得到的二叉树称为 T 的扩充二叉树. 对于扩充二叉树而言, ...

  10. python bisect 排序模块 二分查找与 bisect 模块

    python 3.6.5 import bisect bisect_list=dir(bisect)print(bisect_list)bisect_list = ['__builtins__', ' ...

随机推荐

  1. mongodb 初学 索引

    连接服务器异常(Connection refused) 啦啦啦 mongodb 搭建主从服务器 啦啦啦 Mongodb启动命令mongod参数说明 啦啦啦 MongoDB 分片 啦啦啦 啦啦啦 啦啦啦 ...

  2. mysql字段集合中如何去除其中一个元素

    在一对多方案中,我们用逗号拼接进行存储,避免存储多条,或者分表,那么此时出现了存储上如果需要修改的话 就带来了难度,比如规则记录表如下 如果2号规则被删除,那么这张表的所有有2的记录也要被清除掉,此时 ...

  3. .Net使用DES加密,.Net和java分别解密,并正则匹配替换加密密码为明文

    在VS中用WindowsApplication做一个exe程序,用来给数据库密码加密,加密代码如下 private void generateBtn_Click(object sender, Even ...

  4. Linux oracle数据库创建表空间、用户并赋予权限

    管理员用户登录oracle数据库 1.创建临时表空间 select name from v$tempfile;查出当前数据库临时表空间,主要是使用里面的存放路径: 得到其中一条记录/opt/oracl ...

  5. React Native(十三)——ios键盘挡住textInput

    渐入佳境 用React Native重构的项目也快接近尾声,剩下的就是适配ios的功能了.慢慢地也从中琢磨出了一点门道,于是就遇见了键盘遮挡textInput问题斑斑: 正常页面: android点击 ...

  6. React Native(六)——PureComponent VS Component

    先看两段代码: export class ywg extends PureComponent { …… render() { return ( …… ); } } export class ywg e ...

  7. WF的初步学习与创建

    一直在好奇WF的学习,嘿嘿,今天就不用啦,我之后就要接触WF的项目,刚开始在百度上寻找WF新建一个项目的过程,发现很少这样的实例让我学习操作,我想给我一个大的项目我也不可能一下就知道应该怎样去操作,由 ...

  8. STL——仿函数(函数对象)

    一.仿函数(也叫函数对象)概观 仿函数的作用主要在哪里?从第6章可以看出,STL所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算,第二个版本则表现出最泛化的演算流程,允 ...

  9. 《C++ Primer Plus》第16章 string类和标准模板库 学习笔记

    C++提供了一组功能强大的库,这些库提供了很多常见编程问题的解决方案以及简化其他问题的工具string类为将字符串作为对象来处理提供了一种方便的方法.string类提供了自动内存管理动能以及众多处理字 ...

  10. js 简易模板引擎 , 持续更新。。。

    <script> var _mytpl = (function(){ var _verson = 1.0; return { _data:{}, load:function(html,da ...