class Splay_Tree__Test_Inorder_Traversal_with_Stack_on_10_Node_Tree( unittest.TestCase): def setUp(self): self._splaytree = SplayTree() self._splaytree.insert(key=5, obj=5) self._splaytree.insert(key=8, obj=8) self._splaytree.insert(key=7, obj=7) self._splaytree.insert(key=9, obj=9) self._splaytree.insert(key=10, obj=10) self._splaytree.insert(key=2, obj=2) self._splaytree.insert(key=1, obj=1) self._splaytree.insert(key=3, obj=3) self._splaytree.insert(key=4, obj=4) self._splaytree.insert(key=6, obj=6) def test_inorder_traversal_with_10_node_tree(self): in_order_elements = [] for key, element in self._splaytree.inorder_traversal_with_stack(): in_order_elements.append(element) self.assertEqual( 10, len(in_order_elements), 'In order traversal on 10 node tree must yield 10 elements') self.assertEqual( in_order_elements, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'In order traversal did not yield expected elements in order') def tearDown(self): self._splaytree = None
class Splay_Tree__Test_Inorder_Traversal_Using_Stack_with_empty_Tree( unittest.TestCase): def setUp(self): self._splaytree = SplayTree() def test_inorder_traversal_with_empty_tree(self): in_order_elements = [] for key, element in self._splaytree.inorder_traversal_with_stack(): in_order_elements.append(element) self.assertEqual( 0, len(in_order_elements), 'In order traversal on empty tree must yield no elements') def tearDown(self): self._splaytree = None
class SplayedHashBucket(collections.MutableMapping): ''' A hash bucket is used to hold objects that hash to the same value in a hash table. This is hash bucket using a splay tree. This masquerades as a python dict in code where it is used. Since splat tree is used lookups on avg take Olog(n) Note: HASHBUCKET ITERATION YIELDS KEYS. not the key value pairs in the bucket. ''' def __init__(self): self._st = SplayTree() def __len__(self): return self._st.node_count def get(self, key, default = None): ''' Get object associated with a key and on key miss return specified default. This is there in Python dict and this class masquerades as dict, we implement it. ''' try: value = self[key] return value except KeyError: return default def __getitem__(self, key): value = self._st.find(key) if value == None: raise KeyError('Key Error: %s ' % repr(key)) return value def __delitem__(self, key): if key in self._st: self._st.remove(key) else: raise KeyError('Key Error: %s ' % repr(key)) def __setitem__(self, key, obj): if key in self._st: self._st.replace(key, obj) else: self._st.insert(key, obj) def __iter__(self): for key, value in self._st.inorder_traversal_with_stack(): yield key
class Splay_Tree__Test_Inorder_Traversal_with_Stack_On_Single_Node_Tree( unittest.TestCase): def setUp(self): self._splaytree = SplayTree() self._splaytree.insert(key=10, obj=10) def test_inorder_traversal_with_single_node_tree(self): in_order_elements = [] for key, element in self._splaytree.inorder_traversal_with_stack(): in_order_elements.append(element) self.assertEqual( 1, len(in_order_elements), 'In order traversal on single node tree must yield one elements') self.assertEqual( in_order_elements, [10], 'In order traversal did not yield expected elements in order') def tearDown(self): self._splaytree = None