#encoding=utf8 ''' B+树中的节点。其中value为当前节点值。 lNode为左孩子节点,rNode为右孩子节点,count为重复数量 ''' class TNode(object): def __init__(self,value,lnode=None,rnode=None,count=1): self.value = value self.lNode = lnode self.rNode = rnode self.count = count def setLNode(self,node): self.lNode = node def setRNode(self,node): self.rNode = node def getLNode(self): return self.lNode def getRNode(self): return self.rNode def addCount(self): self.count = self.count+1 def getCount(self): return self.count def setValue(self,value): self.value = value def getValue(self): return self.value ''' 二叉搜索树,在这里用作排序,实际就是一个普通的二叉树。 初始化时,加入一个root节点 addNode方法: 当新加入一个节点,则从根节点开始比较, 与根节点值相同,则将根节点count+1, 大于根节点值,则将其与根节点的右子节点重新开始比较 小于根节点值,则将其与根节点的左子节点重新开始比较 递归完成。 printTree方法: 打印中序遍历树结果。 ''' class BSTSort(object): def __init__(self,node): self.root = node def addNode(self,node): currentNode = self.root while currentNode != None: currentValue = currentNode.getValue() insertValue = node.getValue() if currentValue == insertValue : currentNode.addCount() break elif currentValue > insertValue : if currentNode.getLNode() != None : currentNode = currentNode.getLNode() else: currentNode.setLNode(node) break else: if currentNode.getRNode() != None: currentNode = currentNode.getRNode() else: currentNode.setRNode(node) break def printTree(self,fromNode): if fromNode == None: fromNode = self.root lNode = fromNode.getLNode() rNode = fromNode.getRNode() if lNode != None: self.printTree(lNode) for i in range(0,fromNode.getCount()): print fromNode.getValue() if rNode != None: self.printTree(rNode) def getSortList(self,fromNode,list): if fromNode == None: fromNode = self.root lNode = fromNode.getLNode() rNode = fromNode.getRNode() if lNode != None: self.getSortList(lNode, list) for i in range(0,fromNode.getCount()): list.append(fromNode.getValue()) if rNode != None: self.getSortList(rNode, list) return list list = [19,283,0,-2,-3,89,76,3,5,9,19,879,627,-29,-987,-877,0,0,0] rootNode = TNode(list[0]) bst = BSTSort(rootNode) for i in range(1,len(list)): tmpNode = TNode(list[i]) bst.addNode(tmpNode) #bst.printTree(rootNode) list = [] bst.getSortList(rootNode, list) print list