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
Exemple #2
0
        traversed.append((key, value))
    print('Tree inorder traversal (key, value) pairs:')
    print(traversed)


if __name__ == '__main__':
    bst = SplayTree()
    print('Node count is %s' % str(bst.node_count))
    print('Adding key value pairs (1, 1), (2, 2), .... (6, 6)')
    kvpairs = [(5, 5), (2, 2), (7, 7), (1, 1), (3, 3), (9, 9), (8, 8), (4, 4),
               (6, 6)]

    for kvpair in kvpairs:
        bst.insert(key=kvpair[0], obj=kvpair[1])

    print_tree_inorder(bst)
    print_tree_preorder(bst)
    print_tree_postorder(bst)

    #remove
    element_to_remove = 9
    print('removing element %s' % str(element_to_remove))
    bst.remove(key=element_to_remove)
    print_tree_inorder_using_stack(bst)

    #replace obj for a key
    key_to_replace = 1
    new_object_for_Key = 111

    bst.replace(key=key_to_replace, obj=new_object_for_Key)
    print_tree_inorder_using_stack(bst)