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__', ' ...
随机推荐
- java的子类覆盖梗
项目上线,用户注册时验证码一直报错误,数据库也没问题,代码貌似也没问题. 后面排查到最后,发现是一个子类覆盖父属性问题. JAVA代码中,子类覆盖父类的私有.保护属性,如果不设置get.set方法,拿 ...
- LR 测试http协议xml格式数据接口
Action() { lr_start_transaction("T1"); web_custom_request("xxxxHTTPRequest", &qu ...
- iOS开发-- 字符串分割、拼接
---------------------字符串分割实例---------------------NSString * ptr = @"I am a man"; //将字符串整体作 ...
- vsftpd下错误之:500 OOPS
vsftpd下错误之:500 OOPS.vsftpd 是在Linux发行版中最推崇的一种FTP服务器程序,vsftpd的特点:小巧轻快.安全易用等. Linux也是为人们所常用的操作系统之一.这里主要 ...
- CMake区分32位64位
IF(CMAKE_CL_64) set(platform x64) ELSE(CMAKE_CL_64) set(platform x86) ENDIF(CMAKE_CL_64)
- Linux 下 c 语言 聊天软件
这是我学C语言写的第一个软件,是一个完整的聊天软件,里面包括客户端,和服务器端,可以互现聊天,共享文件,有聊天室等,是一个有TCP和UDP协议的聊天软件,测试过很多次在CENTOS和UBUNTU下都通 ...
- JAVA对URL的解码【转】
前段时间做URL的中文转换,有些url是utf8的格式,有的是gb2312的格式,很难区分到底是utf8还是gb2312,找了好久,发现网上的一个牛人写的转换代码: package org.apach ...
- CSS-筛选 获取第一个td
tr td:first-child{ font-weight:bold; } 看样子,应该是jquery中有些筛选,css也是能够同样进行筛选的,只是模式有些可能不同 a[data-toggle*=' ...
- nodelua
最近在学习go,对go中网络处理的方式比较喜欢,就用lua coroutine + C 模仿着接口实现一个玩具玩玩. 主要框架是lua导入C模块的时候会启动一个网络线程,lua和网络之间通过两个消息队 ...
- 支持向量机SVM进阶
本文适合于对SVM基本概念有一点了解的童鞋. SVM基本概念: 最大边缘平面--基本原理:结构风险最小化 分类器的泛化误差 支持向量 问题描述: 请对一下数据,利用svm对其进行分类. 最 ...