Advertisement
Guest User

Untitled

a guest
May 30th, 2016
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.11 KB | None | 0 0
  1. class BST:
  2.     class Node:
  3.         def __init__(self, data):
  4.             self.data = data
  5.             self.left = None
  6.             self.right = None
  7.            
  8.     def __init__(self, arr=None):
  9.         self.root = None
  10.            
  11.     def __eq__(self, other):
  12.         return (str(self) == str(other))
  13.  
  14.     def __repr__(self):
  15.           return str(self.preorder())
  16.    
  17.     def preorder(self):
  18.         def preorder_node(node):
  19.             if(node is None):
  20.                 return
  21.             yield node.data
  22.             yield from preorder_node(node.left)
  23.             yield from preorder_node(node.right)
  24.         return tuple(preorder_node(self.root))
  25.        
  26.     def __hash__(self):
  27.         return hash(str(self))
  28.    
  29.     def insert(self, data):
  30.         node = self.root
  31.         if(node is None):
  32.             self.root = BST.Node(data)
  33.             return
  34.         while True:
  35.             if(data < node.data):
  36.                 if(node.left != None):
  37.                     node = node.left
  38.                 else:
  39.                     node.left = BST.Node(data)
  40.                     return
  41.             elif(data > node.data):
  42.                 if(node.right != None):
  43.                     node = node.right
  44.                 else:
  45.                     node.right = BST.Node(data)
  46.                     return
  47.                
  48.     def avl(self):
  49.         def equal_depth_node(node):
  50.             if abs(BST.max_depth(node.left)-BST.max_depth(node.right)) > 1:
  51.                 return False
  52.             return True
  53.         def avl_node(node):
  54.             if(node is None):
  55.                 return True
  56.             else:
  57.                 l = avl_node(node.left)
  58.                 r = avl_node(node.right)
  59.                 mdl = equal_depth_node(node)
  60.                 return l and r and mdl
  61.         return avl_node(self.root)
  62.  
  63.     def max_depth(node):
  64.         def depth(node,d):
  65.             if(node is None):
  66.                 return d
  67.             return max(depth(node.left,d+1),depth(node.right,d+1))
  68.         return depth(node,0)
  69.    
  70. class AVLSet:
  71.     def __init__(self):
  72.         self.set = set()
  73.        
  74.     def add(self, seq):     # postupnost dat na vytvorenie stromu
  75.         t = BST()           # prida do mnoziny, len ak podmienka avl
  76.         for prvok in seq:
  77.             t.insert(prvok)
  78.             if(t.avl() == False):
  79.                 return
  80.         if(t.avl()):
  81.             self.set.add(t)
  82.            
  83.     def __iter__(self):
  84.         yield from self.set
  85.        
  86.     def __len__(self):
  87.         return len(self.set)
  88.  
  89.     def all(self, seq):                                 #postupne vygeneruje vsetky permutacie postupnosti
  90.         seqs = AVLSet.sequences(seq)                    # vyrobi stromy a prida do mnoziny, len ak podmienka avl
  91.         for s in seqs:
  92.             self.add(s)
  93.            
  94.     def sequences(seq):
  95. ##        def vkladaj(prvok, postupnosti):
  96. ##            if(postupnosti is None):
  97. ##                tuplik = tuple(prvok)
  98. ##                return [tuplik]
  99. ##            else:
  100. ##                vysl = []
  101. ##                for post in postupnosti:
  102. ##                    for i in range(len(post)):
  103. ##                        pom = list(post)
  104. ##                        pom.insert(prvok, i)
  105. ##                        vysl.append(tuple(pom))
  106. ##        if(len(seq) == 1):
  107. ##            return [seq]
  108. ##        else:
  109. ##            return vkladaj(seq[0],AVLSet.sequences(seq[1:]))
  110.         return [()]
  111.  
  112. if __name__ == '__main__':
  113.     t1 = BST()
  114.     for i in (1, 2, 3, 4):
  115.         t1.insert(i)
  116.     print(t1)
  117.     print('avl =', t1.avl())
  118.     t2 = BST()
  119.     for i in (2, 4, 3, 1):
  120.         t2.insert(i)
  121.     print(t2)
  122.     print('avl =', t2.avl())
  123.     t3 = BST()
  124.     for i in (2, 1, 4, 3):
  125.         t3.insert(i)
  126.     print('eq =', t2 == t3)
  127.     mn = AVLSet()
  128.     mn.add((1, 2, 3, 4))
  129.     mn.add((2, 4, 3, 1))
  130.     mn.add((2, 1, 4, 3))
  131.     mn.add((2, 4, 1, 3))
  132.     print('set:')
  133.     for t in mn:
  134.         print(t)
  135.     print('all:')
  136.     mn = AVLSet()
  137.     mn.all((1, 2, 3, 4))
  138.     print(*mn, sep='\n')
  139.     mn = AVLSet()
  140.     mn.all(range(5))
  141.     print('all range(5) =', len(mn))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement