二叉查找树:Python实现
2013-08-23 19:12
344 查看
#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数据结构————二叉查找树的实现
- 二叉查找树python实现
- 关于二叉查找树中的某个节点的前趋和后继的算法(Python实现)
- python实现二叉查找树
- [从头学数学] 第251节 Python实现数据结构:二叉查找树
- 二叉查找树python实现
- python实现二叉查找树实例代码
- 二叉查找树(binary search tree)——python实现
- Python数据结构————二叉查找树的实现
- python实现二叉查找树
- 二叉查找树python实现
- 二叉查找树:Python实现
- 二叉查找树:Python实现
- python实现二叉树的镜像、公共最低祖先、二叉查找树的搜索
- [算法导论]二叉查找树的实现 @ Python
- python实现监控windows服务并自动启动服务示例
- 使用Python实现win32下IconOverlay开发
- Python :用两个栈实现队列
- LeetCode 96 Unique Binary Search Tree(Python详解及实现)
- python利用urllib实现爬取京东网站商品图片的爬虫实例