【算法——Python实现】二叉搜索树
来源:互联网 发布:sketch中文版软件 编辑:程序博客网 时间:2024/06/08 18:14
# _*_ encoding:utf-8 _*_"""二分搜索树"""from random import randintimport timeimport copyimport Queueclass Node(object): """节点""" def __init__(self, key, value): self.key = key self.value = value self.left = None self.right = Noneclass BinarySearchTree(object): """二叉搜索树""" def __init__(self): self.root = None self.count = 0 def size(self): return self.count def isEmpty(self): return self.count == 0 def insert(self, key, value): # 插入元素 self.root = self.__insert(self.root, key, value) def __insert(self, node, key, value): # 插入元素,向以node为根的二叉树插入元素,返回插入新元素之后的根节点 if not node: # 递归到底,节点直接赋值 self.count =+ 1 return Node(key, value) else: if key == node.key: # key相同,更新value node.value = value elif key < node.key: node.left = self.__insert(node.left, key, value) else: node.right = self.__insert(node.right, key, value) return node def contain(self, key): # 查找元素 return self.__contain(self.root, key) def __contain(self, node, key): # 在以node为根节点的二叉树中查找是否有key元素 if not node: return False if key == node.key: return True elif key < node.key: return self.__contain(node.left, key) else: return self.__contain(node.right, key) def search(self, key): # 查找元素 return self.__search(self.root, key) def __search(self, node, key): # 在以node为根节点的二叉树中查找是否有key元素 if not node: return None if key == node.key: return node.value elif key < node.key: return self.__search(node.left, key) else: return self.__search(node.right, key) def preOrder(self): # 前序遍历 self.__preOrder(self.root) def __preOrder(self, node): # 前序遍历 if not node: return None print node.key self.__preOrder(node.left) self.__preOrder(node.right) def inOrder(self): # 中序遍历 self.__inOrder(self.root) def __inOrder(self, node): # 中序遍历 if not node: return None self.__inOrder(node.left) print node.key self.__inOrder(node.right) def postOrder(self): # 后序遍历 self.__postOrder(self.root) def __postOrder(self, node): # 后序遍历 if not node: return None self.__postOrder(node.left) self.__postOrder(node.right) print node.key def levelOrder(self): # 层序遍历 q = Queue.Queue() q.put(self.root) while not q.empty(): node = q.get() print node.key if node.left: q.put(node.left) if node.right: q.put(node.right) def minimum(self): # 查找最小值 if self.count != 0: minNode = self.__minimum(self.root) return minNode.key def __minimum(self, node): # 查找最小值 if not node.left: return node return self.__minimum(self.left) def maximum(self): # 查找最大值 if self.count != 0: maxNode = self.__maximum(self.root) return maxNode.key def __maximum(self, node): # 查找最大值 if not node.right: return node return self.__maximum(self.right) def removeMin(self): # 删除最小值 if self.root: self.root = self.__removeMin(self.root) def __removeMin(self, node): # 删除最小值,删除以node为根的二叉搜索树中最小的节点,返回删除后新的二叉搜索树的根 if not node.left: rightNode = node.right self.count -= 1 return rightNode node.left = self.__removeMin(node.left) return node def removeMax(self): # 删除最大值 if self.root: self.root = self.__removeMax(self.root) def __removeMax(self, node): # 删除最大值,删除以node为根的二叉搜索树中最大的节点,返回删除后新的二叉搜索树的根 if not node.right: leftNode = node.left self.count -= 1 return leftNode node.right = self.__removeMax(node.right) return node def remove(self, key): # 删除节点 self.root = self.__remove(self.root, key) def __remove(self, node, key): # 删除节点,删除以node为根的二叉搜索树中key节点,返回删除后新的二叉搜索树的根 if not node: return None if key < node.key: node.left = self.__remove(node.left, key) return node elif key > node.key: node.right = self.__remove(node.right, key) return node else: # key == node.key if not node.left: # 没有左孩子 rightNode = node.right self.count -= 1 return rightNode if not node.right: # 没有右孩子 leftNode = node.left self.count -= 1 return leftNode if node.left and node.right: # 找到要删除节点右子树中的最小节点,先删除此节点,然后用此节点替换要删除的节点 successor = self.__minimum(node.right) successor.right = self.__removeMin(node.right) successor.left = node.left return successorif __name__=="__main__": tree = BinarySearchTree() tree.insert(5,'five') tree.insert(7,'seven') print tree.search(5)
阅读全文
0 0
- 【算法——Python实现】二叉搜索树
- Python 数据结构与算法——二叉搜索树的实现
- 二叉搜索树 python实现
- 算法导论—二叉搜索树(BST)
- 使用python实现二叉搜索树
- 搜索二叉树的python实现
- 平衡搜索二叉树的python实现
- 二叉搜索树 实现 算法摘记
- 二叉搜索树各种算法的实现
- 算法导论:c++实现二叉搜索树
- 算法与数据结构基础11:C++实现——二叉搜索树节点删除
- 【二叉树遍历算法】——广/深度优先搜索的实现
- 《数据结构与算法分析(c描述)》——二叉搜索树实现
- 【Python排序搜索基本算法】之二叉树的遍历
- 算法导论程序28--查询二叉搜索树(Python)
- 算法导论程序39--最优二叉搜索树(Python)
- python算法之——二叉树
- 算法————笔试内容--->二叉搜索树
- Golang:使用 httprouter 构建API 服务器
- BZOJ 4832 [Lydsy2017年4月月赛]抵制克苏恩 期望dp
- Android实现不重复启动APP的方法android:alwaysRetainTaskState = true
- F
- setClickable 和setEnable 的区别
- 【算法——Python实现】二叉搜索树
- ActiveMQ(三):消息监听器 MessageListener
- PAT甲级1064
- 挖坑小团队之经验总结
- net/http包的使用模式和源码解析
- Linux快速读取文件之文件映射c++实例
- 【iOS开发】使用扩展方法时出现"selector not recognized" runtime exceptions的解决方案
- Server Tomcat v7.0 Server at localhost failed to start
- 危桥僵尸问题的制度思考