#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. COM编程入门第二部分——深入COM服务器

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

  2. [CSS3] Interactive Pseudo-Classes :link :visited :hover :active

    The interactive pseudo-classes for links (and buttons) allow us to make sure the user knows what ele ...

  3. [Javascript] Advanced Reduce: Additional Reducer Arguments

    Sometimes we need to turn arrays into new values in ways that can't be done purely by passing an acc ...

  4. SpannableString的一个奇怪的问题

    今天使用spannableString遇到一个奇怪的问题,就是在setspan的时候,原本可以写成 spannableString.setSpan(new RelativeSizeSpan(0.5f) ...

  5. TCP总结

      TCP协议   <计算机网络>谢希仁 及笔记 TCP 的那些事儿(上):http://coolshell.cn/articles/11564.html TCP 的那些事儿(下):htt ...

  6. 字符串转化为json的三种方法

    1,eval方式解析,恐怕这是最早的解析方式了.如下: function strToJson(str){ var json = eval('(' + str + ')'); return json;  ...

  7. 富文本文件CKEDITOR增加上传图片功能(.net)

    如题,本身的CKEDITOR控件并没有开启上传图片的功能, 打开图像按钮,只有图像信息和高级两个table选项卡,版本不同,显示略有差异,我的实现是有两种方法都可以添加上传功能, 第一种方法使用CKE ...

  8. SOA

    面向服务架构Service-Oriented Architecture 4个特性 1每个服务具有明确的边界 2服务是独立的 3采用标准的契约定义和通信协议 4服务是自解释的

  9. android 广播分类

    安卓广播分为两类:1.普通广播, broadcast,广播发出之后所有满足条件的应用都能获取到广播里面的数据,缺点是应用获取广播中的数据修改之后不能传递给其它接收广播的应用:2.有序广播,orderb ...

  10. css文件和js文件后面带一个问号

    经常看一些网站页面源代码中的css文件和js文件后面带一个问号,后面跟着一连串数字或字符,这是干什么用的? 这个方法我也用过,而且很好用?,它的作用有两个:1.作为版本号,让自己方便记忆.查找:2.作 ...