Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.03 KB | None | 0 0
  1.  
  2. from Rivisitazione.Tree import Tree
  3. from Rivisitazione.sorted_table_map import SortedTableMap
  4.  
  5.  
  6. class LinkedMwTree(Tree):
  7.  
  8.     class _Node:
  9.  
  10.         __slots__ = '_elements' , '_parent' ,  '_size_elem' ,'_last'
  11.  
  12.         def __init__(self, elements= None , parent=None ,last=None ):
  13.  
  14.             self._elements= SortedTableMap() if elements is None else elements
  15.             self._parent=parent
  16.             self._last = last
  17.             self._size_elem= 0 if elements is None else len(self._elements)
  18.  
  19.  
  20.     class Position(Tree.Position):
  21.  
  22.         __slots__ = 'index'
  23.  
  24.         def __init__(self, container, node , index=0):
  25.  
  26.             self._container = container
  27.             self._node = node
  28.             self._index = index
  29.  
  30.         def element(self):
  31.  
  32.             return self._node._elements
  33.  
  34.         def get_index(self):
  35.             return self._index
  36.  
  37.         def get_key(self):
  38.  
  39.             return self.element().get_by_index(self.get_index())[0]
  40.  
  41.         def get_value(self):
  42.  
  43.             return self.element().get_by_index(self.get_index())[1]
  44.  
  45.         def get_item(self):
  46.  
  47.             return self.element().get_by_index(self.get_index())
  48.  
  49.         def get_size(self):
  50.             return self._node._size_elem
  51.  
  52.         def get_last(self): #da inserire nell'alber
  53.             return self._node._last
  54.  
  55.         def keys(self):
  56.             for k in self.element().keys():
  57.                 yield k
  58.  
  59.         def value(self):
  60.             for v in self.element().value():
  61.                 yield v
  62.             yield self.get_last()
  63.  
  64.         def num_elem(self):
  65.  
  66.             if self.get_last() == None:
  67.                 return 0
  68.             else:
  69.                 return len(self.element())
  70.  
  71.  
  72.         def __eq__(self, other):
  73.  
  74.             return type(other) is type(self) and other._node is self._node
  75.  
  76.         def __str__(self):
  77.             s="[ "
  78.             for e in self.element().keys():
  79.                 s+=str(e)+" "
  80.             return s + "]"
  81.  
  82.             # ------------------------------- utility methods -------------------------------
  83.  
  84.     def _validate(self, p):
  85.         """Return associated node, if position is valid."""
  86.         if not isinstance(p, self.Position):
  87.             raise TypeError('p must be proper Position type')
  88.         if p._container is not self:
  89.             raise ValueError('p does not belong to this container')
  90.         if p._node._parent is p._node:  # convention for deprecated nodes
  91.             raise ValueError('p is no longer valid')
  92.         return p._node
  93.  
  94.  
  95.     def _make_position(self, node):
  96.         """Return Position instance for given node (or None if no node)."""
  97.         return self.Position(self, node) if node is not None else None
  98.  
  99.         # --------------------------  alberi constructor --------------------------
  100.  
  101.     def __init__(self):
  102.         """Create an initially empty binary alberi."""
  103.         self._root = None
  104.         self._size = 0
  105.  
  106.         # -------------------------- public accessors --------------------------
  107.  
  108.     def __len__(self):
  109.         """Return the total number of elements in the alberi."""
  110.         return self._size
  111.  
  112.     def root(self):
  113.         """Return the root Position of the alberi (or None if alberi is empty)."""
  114.         return self._make_position(self._root)
  115.  
  116.     def parent(self, p):
  117.         """Return the Position of p's parent (or None if p is root)."""
  118.         node = self._validate(p)
  119.         return self._make_position(node._parent)
  120.  
  121.  
  122.     def num_children(self, p):
  123.         """Return the number of children of Position p."""
  124.         node = self._validate(p)
  125.  
  126.         if node._last is None:
  127.             return 0
  128.         else:
  129.             return len(node._elements) + 1
  130.  
  131.  
  132.  
  133.             # -------------------------- nonpublic mutators --------------------------
  134.  
  135.     def _add_root(self, e):
  136.         """Place element e at the root of an empty alberi and return new Position.
  137.  
  138.        Raise ValueError if alberi nonempty.
  139.        """
  140.         if self._root is not None:
  141.             raise ValueError('Root exists')
  142.         self._size = 1
  143.         self._root = self._Node(e)
  144.         return self._make_position(self._root)
  145.  
  146.     def _delete(self, p , key):
  147.         "del key from position"
  148.         node = self._validate(p)
  149.         del node._elements[key]
  150.         self._size-=1
  151.         node._size_elem-=1
  152.  
  153.     #fine linked ora dobbiamo fare binary
  154.  
  155.     def children(self, p):
  156.         """Generate an iteration of Positions representing p's children."""
  157.         node = self._validate(p)
  158.  
  159.         if self.num_children(p)!=0:
  160.             for c in node._elements.value():
  161.                 yield self._make_position(c)
  162.  
  163.             yield self._make_position(node._last)
  164.  
  165.     def right_brother(self,p):
  166.         "return the right brother or Null"
  167.         self._validate(p)
  168.         if(p != self.root()):
  169.             parent = self.parent(p)
  170.             last_key = p.element().find_max()[0]
  171.             last_parent_key = parent.element().find_max()[0]
  172.  
  173.             father_key = parent.element().find_gt(last_key)
  174.  
  175.             if (father_key == None):
  176.                 return None
  177.             elif (father_key[0] == last_parent_key):
  178.                 return self._make_position(parent.get_last())
  179.             else:
  180.                 return self._make_position(parent.element().find_gt(father_key[0])[1])
  181.         return None
  182.  
  183.  
  184.     def left_brother(self,p):
  185.         "return the left brother or Null"
  186.         if (p != self.root()):
  187.             self._validate(p)
  188.             parent = self.parent(p)
  189.             last_key = p.element().find_max()[0]
  190.             first_parent_key = parent.element().find_min()[0]
  191.  
  192.             father_key = parent.element().find_gt(last_key)
  193.  
  194.             if (father_key == None):  # sono last
  195.                 return self._make_position(parent.element().find_max()[1])
  196.             elif (father_key[0] == first_parent_key):  # sono il primo
  197.                 return None
  198.             else:
  199.                 return self._make_position(parent.element().find_lt(father_key[0])[1])
  200.         return None
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement