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
python数据结构之树(二分查找树)的更多相关文章
- 手把手教你用java实现二分查找树及其相关操作
二分查找树(Binary Search Tree)的基本操作有搜索.求最大值.求最小值.求前继.求后继.插入及删除. 对二分查找树的进行基本操作所花费的时间与树的高度成比例.例如有n个节点的完全二叉树 ...
- Go 数据结构--二分查找树
Go 数据结构--二分查找树 今天开始一个Go实现常见数据结构的系列吧.有时间会更新其他数据结构. 一些概念 二叉树:二叉树是每个节点最多有两个子树的树结构. 完全二叉树:若设二叉树的高度为h,除第 ...
- Python与数据结构[3] -> 树/Tree[1] -> 表达式树和查找树的 Python 实现
表达式树和查找树的 Python 实现 目录 二叉表达式树 二叉查找树 1 二叉表达式树 表达式树是二叉树的一种应用,其树叶是常数或变量,而节点为操作符,构建表达式树的过程与后缀表达式的计算类似,只不 ...
- lintcode-106-排序列表转换为二分查找树
106-排序列表转换为二分查找树 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例 标签 递归 链表 思路 类似于二分查找,每次将链表二分,中间节点作为根节点,在建立左子树 ...
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
议题:二分查找树性能分析(Binary Search Tree Performance Analysis) 分析: 二叉搜索树(Binary Search Tree,BST)是一颗典型的二叉树,同时任 ...
- 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers
题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...
- 【数据结构】关于前缀树(单词查找树,Trie)
前缀树的说明和用途 前缀树又叫单词查找树,Trie,是一类常用的数据结构,其特点是以空间换时间,在查找字符串时有极大的时间优势,其查找的时间复杂度与键的数量无关,在能找到时,最大的时间复杂度也仅为键的 ...
- SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)
题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,0 ...
- Python 数据结构与算法 —— 哈弗曼树
1. 从扩充二叉树到哈弗曼树 扩充二叉树:对二叉树 T,加入足够多的新叶节点(而不是任意),使 T 的原有结点都变成度数为 2 的分支节点,得到的二叉树称为 T 的扩充二叉树. 对于扩充二叉树而言, ...
- python bisect 排序模块 二分查找与 bisect 模块
python 3.6.5 import bisect bisect_list=dir(bisect)print(bisect_list)bisect_list = ['__builtins__', ' ...
随机推荐
- hdu5289 2015多校联合第一场1002 Assignment
题意:给出一个数列.问当中存在多少连续子区间,当中子区间的(最大值-最小值)<k 思路:设dp[i]为从区间1到i满足题意条件的解.终于解即为dp[n]. 此外 如果对于arr[i] 往左遍历 ...
- mongodb 搭建主从服务器
mongodb 主从配置比较简单,只需要在启动的时候添加参数(-master.-slave -source IP:PORT). Ubuntu 16.04 系统环境 监听端口分别为:27010.2701 ...
- [AX]AX2012 Interaction class
Ax2012 Client的form如果属性FormTemplate设置为DetailsPage或者ListPage,则必须同时设置属性InteractionClass为相应的Interaction类 ...
- PostgreSQL存储过程(2)-基于PL/PgSQL的存储过程
介绍 PL/pgSQL 是PostgreSQL 数据库系统的一个可加载的过程语言. PL/pgSQL 的设计目标是创建一种可加载的过程语言,可以 用于创建函数和触发器过程, 为SQL 语言增加控制结构 ...
- Linux ab 命令
ab 是一个性能测试工具,用来测试一个页面每秒钟能处理多少HTTP请求 [root@localhost ~]$ yum install -y httpd-tools # 安装ab工具 [root@lo ...
- Kafka Java API操作topic
Kafka官方提供了两个脚本来管理topic,包括topic的增删改查.其中kafka-topics.sh负责topic的创建与删除:kafka-configs.sh脚本负责topic的修改和查询,但 ...
- 有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?
本文转载至 http://www.cnblogs.com/ios122/p/4832859.html Apple 算是最重视应用开发体验的公司了.从Xib到StoryBoard,从Auto Layou ...
- (原)android修改文件所属的用户组
首先得安装了busybox: 命令如下: busybox fileName 其中的0表示root,改成1000则表示system,改成2000则表示shell.
- struts.xml文件中配置tiles.xml
Apache Tiles是一个JavaEE应用的页面布局框架.Tiles框架提供了一种模板机制,可以为某一类页面定义一个通用的模板,该模板定义了页面的整体布局.布局由可以复用的多个块组成,每个页面可以 ...
- thinkphp5.0 获取请求信息
如果要获取当前的请求信息,可以使用\think\Request类,除了下文中的 $request = Request::instance(); 也可以使用助手函数 $request = request ...