二叉搜索树

来源:互联网 发布:全球化 知乎 编辑:程序博客网 时间:2024/06/01 23:59
# -*- encoding:utf8 -*-# 二叉搜索树class TreeNode(object):def __init__(self, key):self._key = keyself._left = Noneself._right = Noneself._parent = Nonedef getKey(self):return self._keydef setKey(self, key):self._key = keykey = property(getKey, setKey)def getLeft(self):return self._leftdef setLeft(self, left):self._left = leftif left:left.parent = selfleft = property(getLeft, setLeft)def getRight(self):return self._rightdef setRight(self, right):self._right = right if right:right.parent = selfright = property(getRight, setRight)def setParent(self, parent):self._parent = parentdef getParent(self):return self._parentparent = property(getParent, setParent)class BinaryTree(object):def __init__(self, root):if not isinstance(root, TreeNode):root = TreeNode(root)self.root = rootdef setRoot(self, root):self.root = rootdef getRoot(self):return self.rootdef _find(self, current_node, last_node, new_node):if not current_node:return last_node, Falseelif current_node.key == new_node:return current_node, Trueelse:if new_node < current_node.key:return self._find(current_node.left, current_node, new_node)else:return self._find(current_node.right, current_node, new_node)def findnode(self, new_node):current_node, isExist = self._find(self.root, self.root, new_node)if isExist:return current_nodeelse:return Nonedef insert(self, new_node):current_node, isExist = self._find(self.root, self.root, new_node)if isExist:#节点已经存在,不需要添加returnelse:if new_node < current_node.key:current_node.left = TreeNode(new_node)else:current_node.right = TreeNode(new_node)def _minnode(self, node):current_node = nodeif not current_node:return None while current_node.left:current_node = current_node.leftreturn current_nodedef minnode(self):return self._minnode(self.root)def _maxnode(self, node):current_node = nodeif not current_node:return None while current_node.right:current_node = current_node.rightreturn current_nodedef maxnode(self):return self._maxnode(self.root)def previous(self, node):"""寻找前驱"""current_node, isExist = self._find(self.root, self.root, node)if not isExist:raise Exception("节点%s不存在" % node)else:if current_node.left:return self._maxnode(current_node.left)else:if current_node.key == self.minnode().key:#最小节点没有前驱returnelse:previous_node = current_node.parentwhile previous_node:if current_node == previous_node.right:return previous_nodeelse:current_node = previous_nodeprevious_node = previous_node.parentdef next(self, node):"""寻找后继"""current_node, isExist = self._find(self.root, self.root, node)if not isExist:raise Exception("节点%s不存在" % node)else:if current_node.right:return self._minnode(current_node.right)else:if current_node.key == self.maxnode().key:#最大节点没有后继returnelse:previous_node = current_node.parentwhile previous_node:if current_node == previous_node.left:return previous_nodeelse:current_node = previous_nodeprevious_node = previous_node.parentdef delete(self, node):current_node, isExist = self._find(self.root, self.root, node)if not isExist:# 结点不存在returnelse:if current_node.left:previous_node = self.previous(current_node.key)# print 'key:',previous_node.keyparent_node = previous_node.parent# print 'key:',parent_node.keyif parent_node.key < previous_node.key:parent_node.right = previous_node.leftelse:parent_node.left = previous_node.leftcurrent_node.key = previous_node.key# print 'key:',current_node.keyelif current_node.right:next_node = self.next(current_node.key)parent_node = next_node.parentif parent_node.key > next_node.key:parent_node.left = next_node.rightelse:parent_node.right = next_node.rightcurrent_node.key = next_node.keyelse:parent_node = current_node.parentif parent_node.key > current_node.key:parent_node.left = Noneelse:parent_node.right = Nonedef show(self, items, node):if not node:returnelse:self.show(items, node.left)items.append(str(node.key))self.show(items, node.right)def __str__(self):alist = []self.show(alist, self.root)return '\n'.join(alist)

0 0