#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. ZAB协议(转)

    转自:http://www.cnblogs.com/sunddenly/articles/4073157.html Zab协议   一.ZooKeeper概述 ZooKeeper内部有一个in-mem ...

  2. SpringMVC框架图解析

    Spring框架提供了构造Web应用程序的全能MVC模块.Spring MVC分离了控制器.模型对象.分派器以及处理程序对象的角色,这种分离让它们更容易进行制定.是一个标准的MVC框架. 那你猜一猜哪 ...

  3. 解决从VIM复制出来的代码格式错乱或对齐的问题

    这篇文适合给使用VIM的小鸟看,不太适合老鸟 之前有一个问题就是只要是从VIM复制出来的代码,无论是放到CSDN还是GITHUB上面都会变得非常难看. 在VIM里面你看着以为对齐了,实际没有.先说一下 ...

  4. android performClick使用

    performClick 是使用代码主动去调用控件的点击事件(模拟人手去触摸控件) ----------------------------------------- boolean android. ...

  5. COM编程入门第二部分——深入COM服务器

    本文为刚刚接触COM的程序员提供编程指南,解释COM服务器内幕以及如何用C++编写自己的接口.继上一篇COM编程入门之后,本文将讨论有关 COM服务器的内容,解释编写自己的COM接口和COM服务器所需 ...

  6. In-Cell、On-Cell和OGS全贴合屏幕技术区别

    昨天刚发布的小米3用的是OGS全贴合屏幕技术,包括魅族MX3也是同样的技术,但是iPhone5是In-Cell屏幕技术,什么才是全贴合?它们之间到底有何区别?哪个好?小编今天就来普及一下全贴合屏幕技术 ...

  7. mongodb查询之模糊查询

    mongodb的模糊查询是用正则表达式来实现的.例子如下: db.COMMODITY_COMMODITY_SHOP.find({name:{$regex :/南京/i}})

  8. iOS中忽略NSLog打印信息(通过PCH文件中定义DEBUG宏解决)

    iOS中忽略NSLog打印信息 解决办法: 1.新建PrefixHeader_pch文件,在该文件中定义一下宏 //通过DEBUG宏的定义来解决Debug状态下和Release状态下的输出 #ifde ...

  9. JavaScript Arguments 实现可变参数的函数,以及函数的递归调用

    //可变参数的函数 注:也可以使用对象作为参数来实现 function Max() { var temp = arguments[0] || 0; for (var i = 1; i < arg ...

  10. Struts2 之 ognl

    OGNL表达式语言(#号的用法) 用法1:访问OGNL上下文和Action上下文,#相当ActionContext.getContext() 1.  如果访问其他Context中的对象,由于他们不是根 ...