class Node(object): __slots__ = ['left', 'right', 'data'] def __init__(self, data, left=None, right=None): self.data = data self.left = left self.right = right def __str__(self): sl = '%s <-' % self.left if self.left else '' sr = '-> %s' % self.right if self.right else '' return '[%s Node(%s) %s]' % (sl, self.data, sr) class BinarySearchTree(object): def __init__(self): self.root = None def insert(self, data): node, parent = self.search(data, True) if node: raise ValueError('"%s" has been in tree.' % data) node = Node(data) if parent is None: self.root = node elif data < parent.data: parent.left = node else: parent.right = node def search(self, data, retParent=False): parent = None node = self.root while node and node.data != data: parent = node if data < node.data: node = node.left else: node = node.right return (node, parent) if retParent else node def delete(self, data): self._deleteNode(*self.search(data, True)) def _findBiggest(self, node): parent = None while node.right: parent = node node = node.right return node, parent def _deleteNode(self, node, parent): if node is None: return if node.left and node.right: tmp, tmpParent = self._findBiggest(node.left) if tmpParent is not None: tmpParent.right = tmp.left tmp.left = node.left tmp.right = node.right else: tmp = node.left or node.right if parent is None: self.root = tmp elif parent.left is node: parent.left = tmp else: parent.right = tmp if __name__ == '__main__': bst = BinarySearchTree() while True: cmd = (raw_input('$ ')).strip().split() if cmd[0] == 'i': bst.insert(int(cmd[1])) print bst.root elif cmd[0] == 'd': bst.delete(int(cmd[1])) print bst.root
劉碩老師Python精品課程:
《Python高級編程技巧實戰》:
http://coding.imooc.com/class/62.html
《Python算法實戰視頻課程》:
http://study.163.com/course/courseMain.htm?courseId=1003617013
《Python科學計算—NumPy實戰課程》:
http://edu.51cto.com/course/course_id-5046.html
熊貓TV直播間: