#coding:utf8
#author:HaxtraZ class BST(object):
"""二叉查找树的简单实现"""
def __init__(self):
self.root = None def insert(self, val):
newNode = BSTnode(val)
if self.root is None:
self.root = newNode
else:
curNode = self.root
while True:
if val < curNode.val:
#进入左子树
if curNode.left is None:
curNode.left = newNode
newNode.parent = curNode
break
curNode = curNode.left
else:
#进入右子树
if curNode.right is None:
curNode.right = newNode
newNode.parent = curNode
break
curNode = curNode.right def find(self, val):
curNode = self.root
while curNode is not None:
if val < curNode.val:
curNode = curNode.left
elif val > curNode.val:
curNode = curNode.right
else:
return True # 找到了! return False # 没找到 def delete(self, val):
curNode = self.root
while curNode is not None:
if val < curNode.val:
curNode = curNode.left
elif val > curNode.val:
curNode = curNode.right
else:
# 找到了val
if curNode.left is not None and curNode.right is not None:
target = self.successor(curNode.right).val
curNode.val = target.val
self.delete(target)
elif curNode.left is not None:
if curNode == self.root:
self.root = curNode.left
parNode = curNode.parent
subNode = curNode.left
if parNode.left == curNode:
parNode.left = subNode
else:
parNode.right = subNode
subNode.parent = parNode
else:
if curNode == self.root:
self.root = curNode.right
parNode = curNode.parent
subNode = curNode.right
if parNode.right == curNode:
parNode.right = subNode
else:
parNode.left = subNode return True
return False # 不存在val,删除失败 def minimum(self, node):
# 返回最小值的节点。其实就是most left one
curNode = node
if curNode is None:
#空树
return None
while curNode.left is not None:
curNode = curNode.left
return curNode def maximum(self, node):
#返回最大值的节点。其实就是most right one
curNode = node
if curNode is None:
#空树
return None
while curNode.right is not None:
curNode = curNode.right
return curNode def successor(self, node):
#node是二叉查找树中的一个节点
#寻找node的后继节点,然后返回
curNode = node
if curNode.right is not None:
#右子树非空,返回右子树最左节点
return self.minimun(curNode.right)
else:
#右子树为空,则返回“最低祖先”
parNode = curNode.parent
while parNode is not None and parNode.right == curNode:
curNode = parNode
parNode = parNode.parent
return parNode def show(self):
# 中序遍历
self.display(self.root)
print '\n' def display(self, node):
if node is None:
return
self.display(node.left)
print node.val,
self.display(node.right) # def predecessor(self, node):
# 获取前驱节点。类似于获取后继节点,这里省略。。 class BSTnode(object):
"""二叉查找树的节点类型"""
def __init__(self, val):
self.val = val
self.left = None
self.right = None
self.parent = None if __name__ == '__main__':
mylist = [2, 2, 7, 4, 1, 5]
bst = BST()
for i in range(len(mylist)):
bst.insert(mylist[i]) bst.show()
bst.delete(7)
bst.show()

二叉查找树,英文Binary Search Tree,也叫二叉排序树,是一种基本的数据结构,简称BST

它支持多种动态集合操作,包括查找(find),最小值(minimum),最大值(maximum),后继(successor),前驱(predecessor),插入(insert),删除(delete),以及中序遍历等。它既可以用作字典,也可以用作优先队列。

BST不是稳定的树,极端情况下会退化为线性结构,但平均期望上,insert,delete操作可以为O(lg n),树的期望高度为O(lg n)。

参考了《算法导论》等书,写出了具有insert,delete,find功能的BST,如果有认为不正确的地方欢迎拍砖。

二叉查找树:Python实现的更多相关文章

  1. 二叉查找树python实现

    1. 二叉查找树的定义: 左子树不为空的时候.左子树的结点值小于根节点,右子树不为空时,右子树的结点值大于根节点.左右子树分别为二叉查找树 2. 二叉查找树的最左边的结点即为最小值,要查找最小值.仅仅 ...

  2. [算法导论]二叉查找树的实现 @ Python

    <算法导论>第三版的BST(二叉查找树)的实现: class Tree: def __init__(self): self.root = None # Definition for a b ...

  3. Python数据结构————二叉查找树的实现

    对于二叉查找树的每个节点Node,它的左子树中所有的关键字都小于Node的关键字,而右子树中的所有关键字都大于Node的关键字. 二叉查找树的平均深度是O(log N). 1.初始化 class Bi ...

  4. 【数据结构与算法Python版学习笔记】树——二叉查找树 Binary Search Tree

    二叉搜索树,它是映射的另一种实现 映射抽象数据类型前面两种实现,它们分别是列表二分搜索和散列表. 操作 Map()新建一个空的映射. put(key, val)往映射中加入一个新的键-值对.如果键已经 ...

  5. 常用查找数据结构及算法(Python实现)

    目录 一.基本概念 二.无序表查找 三.有序表查找 3.1 二分查找(Binary Search) 3.2 插值查找 3.3 斐波那契查找 四.线性索引查找 4.1 稠密索引 4.2 分块索引 4.3 ...

  6. python之redis和memcache操作

    Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...

  7. lintcode: 二叉查找树中搜索区间

    题目 二叉查找树中搜索区间 给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点.找到树中所有值在 k1 到 k2 范围内的节点.即打印所有x (k1 <= x <= ...

  8. lintcode:在二叉查找树中插入节点

    题目:  在二叉查找树中插入节点 给定一棵二叉查找树和一个新的树节点,将节点插入到树中. 你需要保证该树仍然是一棵二叉查找树.  样例 给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样 ...

  9. Python爬取CSDN博客文章

    0 url :http://blog.csdn.net/youyou1543724847/article/details/52818339Redis一点基础的东西目录 1.基础底层数据结构 2.win ...

随机推荐

  1. css实现小三角效果

    <!DOCTYPE html><html><head><meta charset="UTF-8"> <title>新闻标 ...

  2. linux if 判断字符串是否相等

    在命令行中修改时间: 如果linux系统时间等于2017-09-09,则ok:否则将当前系统时间修改为2017-09-09 var=`date '+%Y-%m-%d'`;if [ "$var ...

  3. linux命令详解--tcpdump

    工作中一直在用tcpdump,感觉非常方便,今天心血来潮百度了一下tcpdump的用法,才发现原来还有这么多强大的功能自己都不知道,那叫一个汗啊. 以此文作为备份,记录一些新知道的用法,各位网友谁有新 ...

  4. android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理

    本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用 ...

  5. Mysql大小写敏感的问题 --转

    一.1 CREATE TABLE NAME(name VARCHAR(10)); 对这个表,缺省情况下,下面两个查询的结果是一样的: SELECT * FROM TABLE NAME WHERE na ...

  6. Linux随笔

    列表:ls -l(显示详细属性)long -a(显示全部文件包括隐藏文件)all -h(字节转换) -d(显示当前目录本身不显示目录下) -i(显示I节点) df -h 人性化查看磁盘占用率 serv ...

  7. SQL语句添加删除修改字段及一些表与字段的基本操作

    用SQL语句添加删除修改字段 1.增加字段     alter table docdsp    add dspcode char(200)2.删除字段     ALTER TABLE table_NA ...

  8. java图片缩放

    package com.rubekid.springmvc.utils; import java.awt.AlphaComposite; import java.awt.Graphics2D; imp ...

  9. 关于在head里的link href=<%=%>,其中前置百分号给编码了的解决方案

    做了一个项目,主要是能够自动换模板,实际就是插入数据库那个css名称,然后前台取出那个值,放入getcss变量里(getcss自己定义的一个变量),然后通过link href=<%=%>取 ...

  10. Linux中 pid_t 类型的定义.

    说明:涉及到的头文件(.h),目录默认都是基于 /usr/include/ 目录. 1.在 "/sys/types.h"中,有下列内容: #include <bits/typ ...