二分探索木
30分プログラム、その206。二分探索木を作る。
そういえば、二分探索木は30分プログラムで作ったことがなかったので。ただ、削除は面倒そうなので、また次回。
ツリーなので、Compositeパターンを多少意識してる。duck typingなので、インターフェースは不要だけど。
使い方
# ツリーを生成する >>> tree = Branch(5) >>> tree (Branch 5 Leaf Leaf) # ツリーにいくつか値を挿入する >>> tree.insert_value(10) (Branch 5 Leaf (Branch 10 Leaf Leaf)) >>> tree.insert_value(1) (Branch 5 (Branch 1 Leaf Leaf) (Branch 10 Leaf Leaf)) # ツリーに含まれているかチェックする >>> tree.contain(1) True >>> tree.contain(3) False
ソースコード
#! /usr/bin/python # -*- mode:python; coding:utf-8 -*- # # binary_tree.py - # # Copyright(C) 2007 by mzp # Author: MIZUNO Hiroki / mzpppp at gmail dot com # http://howdyworld.org # # Timestamp: 2007/12/19 23:07:43 # # This program is free software; you can redistribute it and/or # modify it under MIT Lincence. # class Leaf: def __repr__(self): return "Leaf" def insert(self,node): return node def is_leaf(self): return True def contain(self,value): return False class Branch: def __init__(self,value,left=Leaf(),right=Leaf()): self.value = value self.left = left self.right = right def __repr__(self): return "(Branch %s %s %s)" % (self.value,repr(self.left),repr(self.right)) def insert_value(self,value): return self.insert(Branch(value)) def insert(self,node): target = self.left if node.value < self.value else self.right if node.value < self.value: self.left = self.left.insert(node) else: self.right = self.right.insert(node) return self def is_leaf(self): return True def contain(self,value): if self.value == value: return True elif self.value < value: return self.right.contain(value) else: return self.left.contain(value)