Advertisement
Guest User

whats hashtable

a guest
Nov 21st, 2019
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.31 KB | None | 0 0
  1. class BSTree:
  2.     class Node:
  3.         def __init__(self, val, left=None, right=None):
  4.             self.val = val
  5.             self.left = left
  6.             self.right = right
  7.            
  8.     def __init__(self):
  9.         self.size = 0
  10.         self.root = None
  11.  
  12.     def __contains__(self, val):
  13.         def contains_rec(node):
  14.             if not node:
  15.                 return False
  16.             elif val < node.val:
  17.                 return contains_rec(node.left)
  18.             elif val > node.val:
  19.                 return contains_rec(node.right)
  20.             else:
  21.                 return True
  22.         return contains_rec(self.root)
  23.  
  24.     def add(self, val):
  25.         assert(val not in self)
  26.         def add_rec(node):
  27.             if not node:
  28.                 return BSTree.Node(val)
  29.             elif val < node.val:
  30.                 return BSTree.Node(node.val, left=add_rec(node.left), right=node.right)
  31.             else:
  32.                 return BSTree.Node(node.val, left=node.left, right=add_rec(node.right))
  33.         self.root = add_rec(self.root)
  34.         self.size += 1
  35.        
  36.     def __delitem__(self, val):
  37.         assert(val in self)
  38.         def delitem_rec(node):
  39.             if val < node.val:
  40.                 node.left = delitem_rec(node.left)
  41.                 return node
  42.             elif val > node.val:
  43.                 node.right = delitem_rec(node.right)
  44.                 return node
  45.             else:
  46.                 if not node.left and not node.right:
  47.                     return None
  48.                 elif node.left and not node.right:
  49.                     return node.left
  50.                 elif node.right and not node.left:
  51.                     return node.right
  52.                 else:
  53.                     # remove the largest value from the left subtree as a replacement
  54.                     # for the root value of this tree
  55.                     t = node.left # refers to the candidate for removal
  56.                     if not t.right:
  57.                         node.val = t.val
  58.                         node.left = t.left
  59.                     else:
  60.                         n = t
  61.                         while n.right.right:
  62.                             n = n.right
  63.                         t = n.right
  64.                         n.right = t.left
  65.                         node.val = t.val
  66.                     return node
  67.                
  68.         self.root = delitem_rec(self.root)
  69.         self.size -= 1
  70.  
  71.     def __iter__(self):
  72.         def iter_rec(node):
  73.             if node:
  74.                 yield from iter_rec(node.left)
  75.                 yield node.val
  76.                 yield from iter_rec(node.right)
  77.                    
  78.         return iter_rec(self.root)
  79.            
  80.     def __len__(self):
  81.         return self.size
  82.    
  83.     def pprint(self, width=64):
  84.         """Attempts to pretty-print this tree's contents."""
  85.         height = self.height()
  86.         nodes  = [(self.root, 0)]
  87.         prev_level = 0
  88.         repr_str = ''
  89.         while nodes:
  90.             n,level = nodes.pop(0)
  91.             if prev_level != level:
  92.                 prev_level = level
  93.                 repr_str += '\n'
  94.             if not n:
  95.                 if level < height-1:
  96.                     nodes.extend([(None, level+1), (None, level+1)])
  97.                 repr_str += '{val:^{width}}'.format(val='-', width=width//2**level)
  98.             elif n:
  99.                 if n.left or level < height-1:
  100.                     nodes.append((n.left, level+1))
  101.                 if n.right or level < height-1:
  102.                     nodes.append((n.right, level+1))
  103.                 repr_str += '{val:^{width}}'.format(val=n.val, width=width//2**level)
  104.         print(repr_str)
  105.    
  106.     def height(self):
  107.         """Returns the height of the longest branch of the tree."""
  108.         def height_rec(t):
  109.             if not t:
  110.                 return 0
  111.             else:
  112.                 return max(1+height_rec(t.left), 1+height_rec(t.right))
  113.         return height_rec(self.root)
  114.  
  115. # ##########################################
  116.  
  117. class BSTree:
  118.     class Node:
  119.         def __init__(self, key, val, left=None, right=None):
  120.             self.key = key
  121.             self.val = val
  122.             self.left = left
  123.             self.right = right
  124.            
  125.     def __init__(self):
  126.         self.size = 0
  127.         self.root = None
  128.        
  129.     def getNode(self, elNode, key):
  130.         if not elNode:
  131.             return None
  132.        
  133.         if elNode and elNode.key == key:
  134.             return elNode
  135.         else:
  136.             if elNode.left:
  137.                 findLeft = self.getNode(elNode.left, key)
  138.                 if findLeft:
  139.                     return findLeft
  140.             if elNode.right:
  141.                 findRight = self.getNode(elNode.right, key)
  142.                 if findRight:
  143.                     return findRight
  144.             return None
  145.    
  146.     def __getitem__(self, key):
  147.         theNode = self.getNode(self.root, key)
  148.         if theNode:
  149.             return theNode.val
  150.         else:
  151.             raise KeyError("Key not found")
  152.    
  153.     def __setitem__(self, key, val):
  154.         result = self.getNode(self.root, key)
  155.         if result:
  156.             result.val = val
  157.         else:
  158.             def add_rec(node):
  159.                 if not node:
  160.                     return BSTree.Node(key, val)
  161.                 elif val < node.val:
  162.                     return BSTree.Node(node.key, node.val, left=add_rec(node.left), right=node.right)
  163.                 else:
  164.                     return BSTree.Node(node.key, node.val, left=node.left, right=add_rec(node.right))
  165.             self.root = add_rec(self.root)
  166.             self.size += 1
  167.  
  168.     def __delitem__(self, key):
  169.         theNode = self.getNode(self.root, key)
  170.         if not theNode:
  171.             raise KeyError("Key not found")
  172.         val = theNode.val
  173.         def delitem_rec(node):
  174.             if val < node.val:
  175.                 node.left = delitem_rec(node.left)
  176.                 return node
  177.             elif val > node.val:
  178.                 node.right = delitem_rec(node.right)
  179.                 return node
  180.             else:
  181.                 if not node.left and not node.right:
  182.                     return None
  183.                 elif node.left and not node.right:
  184.                     return node.left
  185.                 elif node.right and not node.left:
  186.                     return node.right
  187.                 else:
  188.                     # remove the largest value from the left subtree as a replacement
  189.                     # for the root value of this tree
  190.                     t = node.left # refers to the candidate for removal
  191.                     if not t.right:
  192.                         node.val = t.val
  193.                         node.left = t.left
  194.                     else:
  195.                         n = t
  196.                         while n.right.right:
  197.                             n = n.right
  198.                         t = n.right
  199.                         n.right = t.left
  200.                         node.val = t.val
  201.                     return node
  202.         self.root = delitem_rec(self.root)
  203.         self.size -= 1        
  204.        
  205.     def __contains__(self, key):
  206.         result = self.getNode(self.root, key)  
  207.         return True if result else False
  208.    
  209.     def __len__(self):
  210.         return self.size
  211.    
  212.     def __iter__(self):
  213.         allDescendants = self._collectDescendants(self.root, [self.root])
  214.         for item in allDescendants:
  215.             yield item
  216.    
  217.     def _collectDescendants(self, startNode, descList):
  218.         if not startNode:
  219.             return descList
  220.         if startNode.left:
  221.             descList.append(startNode.left)
  222.             self._collectDescendants(startNode.left, descList)
  223.         if startNode.right:
  224.             descList.append(startNode.right)
  225.             self._collectDescendants(startNode.right, descList)
  226.         return descList
  227.        
  228.     def keys(self):
  229.         return [i[0] for i in self.items()]
  230.  
  231.     def values(self):
  232.         return [i[1] for i in self.items()]
  233.  
  234.     def items(self):
  235.         itemList = []
  236.         for item in self:
  237.             itemList.append((item.key, item.val))
  238.         itemList = sorted(itemList)
  239.         return itemList
  240.        
  241.     def pprint(self, width=64):
  242.         """Attempts to pretty-print this tree's contents."""
  243.         height = self.height()
  244.         nodes  = [(self.root, 0)]
  245.         prev_level = 0
  246.         repr_str = ''
  247.         while nodes:
  248.             n,level = nodes.pop(0)
  249.             if prev_level != level:
  250.                 prev_level = level
  251.                 repr_str += '\n'
  252.             if not n:
  253.                 if level < height-1:
  254.                     nodes.extend([(None, level+1), (None, level+1)])
  255.                 repr_str += '{val:^{width}}'.format(val='-', width=width//2**level)
  256.             elif n:
  257.                 if n.left or level < height-1:
  258.                     nodes.append((n.left, level+1))
  259.                 if n.right or level < height-1:
  260.                     nodes.append((n.right, level+1))
  261.                 repr_str += '{val:^{width}}'.format(val=n.key, width=width//2**level)
  262.         print(repr_str)
  263.    
  264.     def height(self):
  265.         """Returns the height of the longest branch of the tree."""
  266.         def height_rec(t):
  267.             if not t:
  268.                 return 0
  269.             else:
  270.                 return max(1+height_rec(t.left), 1+height_rec(t.right))
  271.         return height_rec(self.root)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement