本篇学习笔记记录二叉查找树的定义以及用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. hdu5289 2015多校联合第一场1002 Assignment

    题意:给出一个数列.问当中存在多少连续子区间,当中子区间的(最大值-最小值)<k 思路:设dp[i]为从区间1到i满足题意条件的解.终于解即为dp[n]. 此外 如果对于arr[i] 往左遍历 ...

  2. mongodb 搭建主从服务器

    mongodb 主从配置比较简单,只需要在启动的时候添加参数(-master.-slave -source IP:PORT). Ubuntu 16.04 系统环境 监听端口分别为:27010.2701 ...

  3. [AX]AX2012 Interaction class

    Ax2012 Client的form如果属性FormTemplate设置为DetailsPage或者ListPage,则必须同时设置属性InteractionClass为相应的Interaction类 ...

  4. PostgreSQL存储过程(2)-基于PL/PgSQL的存储过程

    介绍 PL/pgSQL 是PostgreSQL 数据库系统的一个可加载的过程语言. PL/pgSQL 的设计目标是创建一种可加载的过程语言,可以 用于创建函数和触发器过程, 为SQL 语言增加控制结构 ...

  5. Linux ab 命令

    ab 是一个性能测试工具,用来测试一个页面每秒钟能处理多少HTTP请求 [root@localhost ~]$ yum install -y httpd-tools # 安装ab工具 [root@lo ...

  6. Kafka Java API操作topic

    Kafka官方提供了两个脚本来管理topic,包括topic的增删改查.其中kafka-topics.sh负责topic的创建与删除:kafka-configs.sh脚本负责topic的修改和查询,但 ...

  7. 有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?

    本文转载至 http://www.cnblogs.com/ios122/p/4832859.html Apple 算是最重视应用开发体验的公司了.从Xib到StoryBoard,从Auto Layou ...

  8. (原)android修改文件所属的用户组

    首先得安装了busybox: 命令如下: busybox fileName 其中的0表示root,改成1000则表示system,改成2000则表示shell.

  9. struts.xml文件中配置tiles.xml

    Apache Tiles是一个JavaEE应用的页面布局框架.Tiles框架提供了一种模板机制,可以为某一类页面定义一个通用的模板,该模板定义了页面的整体布局.布局由可以复用的多个块组成,每个页面可以 ...

  10. thinkphp5.0 获取请求信息

    如果要获取当前的请求信息,可以使用\think\Request类,除了下文中的 $request = Request::instance(); 也可以使用助手函数 $request = request ...