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__', ' ...
随机推荐
- 5 -- Hibernate的基本用法 --4 4 数据库方言
Hibernate底层依然使用SQL语句来执行数据库操作,虽然所有关系数据库都支持使用标准SQL语句,但所有数据库都对标准SQL进行了一些扩展,所以在语法细节上存在一些差异.因此,Hibernate需 ...
- 九度 1464:Hello World for U
题目描述: Given any string of N (>=5) characters, you are asked to form the characters into the shape ...
- 基于net.tcp的WCF配置实例解析(转)
http://www.cnblogs.com/scy251147/archive/2012/11/23/2784902.html 原文 本文主要通过文件配置来讲解如何编写一个基于net.tcp的Win ...
- 升级MAC OX上的Python到3.4
第1步:下载Python3.4 下载地址如下: 下载Mac OS X 64-bit/32-bit installerhttps://www.python.org/downloads/release/p ...
- Git Step by Step – (6) Git远程仓库
前面文章中出现的所有Git操作都是基于本地仓库的,但是日常工作中需要多人合作,不可能一直都在自己的代码仓库工作.所以,这里我们就开始介绍Git远程仓库. 在Git系统中,用户可以通过push/pull ...
- ios开发之 -- NSString指定字体高亮显示
一个简单的小需求,就是在一个字符串里面,指定一部分字节高亮显示,代码如下: NSString *descStr = @"需要高亮显示的字符"; NSString *nickStr ...
- 查询mssql 密码
select name,password from syslogins Select master.dbo.fn_varbintohexstr(password_hash) from sys.sql_ ...
- 善用 CSS 中的 table-layout 屬性加快 Table 的顯示速度
在很久以前我們都是用 Table 在排版的,我相信現在還是有不少人還是在用 Table 進行排版而非現在較為流行的 CSS 排版,使用 Table 排版最大的好處就是版面在各瀏覽器中顯示比較不會亂掉. ...
- ISD9160学习笔记03_ISD9160音频解码代码分析
录音例程涉及了录音和播放两大块内容,这篇笔记就先来说说播放,暂且先击破解码这部分功能. 我的锤子便签中有上个月记下的一句话,“斯蒂芬·平克说,写作之难,在于把网状思考,用树状结构,体现在线性展开的语句 ...
- Use Reentrant Functions for Safer Signal Handling(译:使用可重入函数进行更安全的信号处理)
Use Reentrant Functions for Safer Signal Handling 使用可重入函数进行更安全的信号处理 How and when to employ reentranc ...