# /usr/bin/env python #-*- coding:utf-8 -*- import Queue class Stack(object): """ å®ç°ä¸è¿æ¯æäºé®é¢çï¼å 为没æèèæ ç©ºé´ä¸å¤çæ¶åæ©å±çé®é¢ """ def __init__(self, cap): super(Stack, self).__init__() self.__cap = cap #æ å¤§å° self.__length = 0 #æ é¿åº¦ if self.__cap < 0: raise ValueError("length of Stack can not be negtive") self.__values = [0 for x in xrange(0, self.__cap)] def empty(self): return self.__length is 0 def push(self, x): if self.__length >= self.__cap: raise IndexError("stack is full, can not push any object") self.__values[self.__length] = x self.__length += 1 def pop(self): if self.__length <= 0: return None self.__length -= 1 return self.__values[self.__length] def __str__(self): return "".join(["Stack, Value: ", str(self.__values), " cap: ", str(self.__cap), " length:", str(self.__length)]) class Btree(object): """ å®ç°ä¸ä¸ªéç¨çäºåæ ï¼è¿ä¸ªäºåæ å¹¶ä¸å å«ä»»ä½å«çæ§è´¨ """ class Node(object): """docstring for Node""" def __init__(self, key, left, right): self.key = key self.left = left self.right = right def __str__(self): return "".join(["key: ", str(self.key)]) def __init__(self, nodes, root_index=0): """ nodeæ¯ä¸ä¸ªå ç¥å表ï¼é»è®¤ç¬¬ä¸ä¸ªæ¯æ ¹èç¹ï¼ä¾å¦[(key=12,left=7,right=3),(key=15,left=8,right=None)] """ super(Btree, self).__init__() self.__root, self.__nodes = self.build_tree(nodes, root_index) self.__size = len(nodes) def build_tree(self, nodes, root_index=0): tree_nodes = [self.Node(ele[0], ele[1], ele[2]) for ele in nodes] for node in tree_nodes: node.left = tree_nodes[node.left] if node.left is not None else None node.right = tree_nodes[node.right] if node.right is not None else None return (tree_nodes[root_index], tree_nodes) def depth_walk(self, f): """ ä½¿ç¨æ å®ç°æ·±åº¦éåï¼æ¯æ¬¡é½æ¯æå³èç¹æ¾è¿æ éï¼è¿æ ·çä¿è¯æ¯æ¬¡é½æ¯ä¼å 访é®å·¦èç¹ """ result = [] stack = Stack(self.__size) stack.push(self.__root) while not stack.empty(): cur_node = stack.pop() result.append(f(cur_node.key)) if cur_node.right is not None: stack.push(cur_node.right) if cur_node.left is not None: stack.push(cur_node.left) return result def breadth_walk(self, f): """ 使ç¨å å®ç°å¹¿åº¦éå """ result = [] q = Queue.Queue(maxsize=-1) q.put(self.__root) while not q.empty(): cur_node = q.get() result.append(f(cur_node.key)) #注æï¼è¿å¿çé¡ºåºæ¯è¾è®²ç©¶ï¼ä¸è½è°æ¢ if cur_node.left is not None: q.put(cur_node.left) if cur_node.right is not None: q.put(cur_node.right) return result def __str__(self): return "\t".join(self.depth_walk(lambda key: str(key))) def main(): nodes = [(12, 6, 2), (15, 7, None), (4, 9, None), (10, 4, 8), (2, None, None), (18, 0, 3), (7, None, None), (14, 5, 1), (21, None, None), (5, None, None)] btree = Btree(nodes, 5) print btree if __name__ == '__main__': main()