Guest User

Untitled

a guest
Jan 4th, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.20 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #-*- coding:UTF-8-*-
  3. import sys
  4.  
  5. class Item:
  6.     def __init__(self, key, value):
  7.         self.key=key
  8.         self.value=value
  9.  
  10.  
  11. class Node:
  12.     def __init__(self, parent=None, nextNode=None):
  13.         self.parent   = parent
  14.         self.children = []
  15.         self.keys     = []
  16.         self.values   = []
  17.         self.nextNode = nextNode
  18.  
  19.  
  20.     def add(self,item):
  21.         if (not self.children): #leaf
  22.             if (len(self.keys)<3): #if leaf has place
  23.                 return(self.insertinsparseleaf(item)) #insert in leaf
  24.             else:
  25.                 self.splitLeaf(item)
  26.         else:
  27.             for child in self.children:
  28.                 print self.keys
  29.                 if item.key<self.keys[self.children.index(child)]:
  30.                     child.add(item)
  31.                     return("inserted")
  32.                 else:
  33.                     self.children[-1].add(item)
  34.                     return("inserted")
  35.  
  36.  
  37.     def splitLeaf(self,item):
  38.         if (not self.parent):
  39.             if (not self.children):
  40.                 self.firstSplit(item) # special case
  41.                 return("split complete")
  42.             else:
  43.                 self.rootSplit()
  44.         else:
  45.  
  46.             newNode=Node()
  47.             self.nextNode=newNode
  48.             if self.keys[-1]<item.key:
  49.                 popped=self.keys.pop()
  50.                 newNode.keys.append(popped)
  51.                 newNode.values.append(self.values.pop())
  52.                 newNode.keys.append(item.key)
  53.                 newNode.values.append(item.value)
  54.             else:
  55.                 newNode.keys.append(item.key)
  56.                 newNode.values.append(item.value)
  57.                 newNode.keys.append(self.keys.pop())
  58.                 newNode.values.append(self.values.pop())  
  59.             t.root.children.append(newNode)
  60.             t.root.keys.append(newNode.keys[0])
  61.             newNode.parent=self.parent
  62.  
  63.  
  64.             if len(self.parent.children)>4:# internal split requiered
  65.                 self.internalSplit(item)
  66.  
  67.         return("leaf splitted")
  68.  
  69.     def firstSplit(self,item):
  70.         newRoot=Node()
  71.         t.root=newRoot
  72.         newNode=Node()
  73.         self.nextNode=newNode
  74.         self.parent=newRoot
  75.         newNode.parent=newRoot
  76.         if self.keys[-1]<item.key:
  77.             popped=self.keys.pop()
  78.             newNode.keys.append(popped)
  79.             newNode.values.append(self.values.pop())
  80.             newNode.keys.append(item.key)
  81.             newNode.values.append(item.value)
  82.             newRoot.keys.append(popped)
  83.             newRoot.children.append(self)
  84.             newRoot.children.append(newNode)
  85.         else:
  86.             newNode.keys.append(item.key)
  87.             newNode.values.append(item.value)
  88.             newNode.keys.append(self.keys.pop())
  89.             newNode.values.append(self.values.pop())  
  90.             newRoot.keys.append(item.key)        
  91.             newRoot.children.append(newNode)
  92.             newRoot.chilldren.apprnd(self)
  93.  
  94.         return
  95.  
  96.  
  97.     def internalSplit(self, item):
  98.         if (not self.parent.parent):
  99.             self.rootSplit(item)
  100.         else:
  101.             pass
  102.  
  103.     def rootSplit(self,item):
  104.         newRoot=Node()
  105.         newNode=Node()
  106.         newRoot.children.append(self.parent)
  107.         newRoot.children.append(newNode)
  108.         newNode.children.append(self.parent.children.pop(-2))
  109.         newNode.children.append(self.parent.children.pop())
  110.         self.parent.keys.pop(-2)
  111.         newNode.keys.append(self.parent.keys.pop())
  112.         for child in newNode.children:
  113.             child.parent=newNode
  114.         newRoot.keys.append(newNode.children[0].keys[0])
  115.         t.root=newRoot
  116.  
  117.            
  118.  
  119.  
  120.  
  121.     def insertinsparseleaf(self,item):
  122.         self.keys.append(item.key)
  123.         self.keys.sort()
  124.         self.values.insert(self.keys.index(item.key),item.value)
  125.         return "inserted"
  126.  
  127.  
  128.     def search(self,key):
  129.         if (not self.children): #leaf node
  130.             for x in self.keys:
  131.                 if (key==x):
  132.                     return self.values[self.keys.index(x)]
  133.         else: #not leaf nodes
  134.             for x in self.keys:
  135.                 if (key<x):
  136.                     return self.children[self.keys.index(x)].search(key) #terminal recursivity
  137.                 return self.children[len(self.keys)].search(key)    
  138.  
  139.     def addchildrentoprint(self,children):
  140.         toprint=""
  141.         if (not self.children):
  142.             return toprint
  143.         else:      
  144.             for childkey in children.children:
  145.                 toprint += "\t\t "+str(childkey.keys)+"\n"
  146.             return toprint
  147.  
  148.     def printnode(self):
  149.         toprint=""
  150.         if (not self.children): #leaf
  151.             pass
  152.         else:
  153.             for children in self.children:
  154.                 toprint += "\n\t A child with keys :"+str(children.keys)+"\n"
  155.                 toprint += str(self.addchildrentoprint(children))
  156.  
  157.         return "Root has the key(s) : "+str(t.root.keys)+toprint
  158.  
  159. class Tree:
  160.     def __init__(self):
  161.         self.root = None # We init the tree with an empty node
  162.         print "Empty tree created"
  163.  
  164.     def insert(self, item):
  165.         if (not self.root): # First node inserted in tree
  166.             self.root=Node()
  167.             self.root.add(item)
  168.             print "Added root node to tree"
  169.         else:
  170.             self.root.add(item)
  171.  
  172.     def search(self,key):
  173.         if (not self.root):
  174.             print "You need to add an item first."
  175.             return -1
  176.         else:
  177.             return "Item with key "+str(key)+" has the values : "+str(self.root.search(key))
  178.  
  179.     def printree(self):
  180.         print "\n \nCalling print tree method "
  181.         print(self.root.printnode())
  182.  
  183.  
  184.  
  185. print("\n\n")
  186. t=Tree()
  187. i=Item(1,(1,2))
  188. i2=Item(2,(3,4))
  189. i3=Item(3,(5,6))
  190. i4=Item(4,(7,8))
  191. i5=Item(5,(9,10))
  192. i6=Item(6,(11,12))
  193. i7=Item(7,(13,14))
  194. i8=Item(8,(15,16))
  195. i9=Item(9,(17,18))
  196. i10=Item(10,(19,20))
  197. i11=Item(11,(21,22))
  198.  
  199. t.insert(i)
  200.  
  201. t.insert(i2)
  202.  
  203. t.insert(i3)
  204.  
  205. t.insert(i4)
  206.  
  207. t.insert(i5)
  208.  
  209. t.insert(i6)
  210.  
  211. t.insert(i7)
  212.  
  213. t.insert(i8)
  214.  
  215. t.insert(i9)
  216.  
  217. t.insert(i10)
  218. t.insert(i11)
  219. t.printree()
  220.  
  221.  
  222.  
  223.  
  224. print t.search(1)
  225. print t.search(8)
  226. print t.search(10)
  227.  
  228. print "\nProgram ending.\n"
Advertisement
Add Comment
Please, Sign In to add comment