Advertisement
Tyler_Elric

Untitled

Dec 11th, 2015
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.13 KB | None | 0 0
  1.  
  2. class Node:
  3.   def __init__(self,val):
  4.     self.val = val
  5.     self.left = self.right = None
  6.  
  7. class BST:
  8.   def __init__(self):
  9.     self.root = None
  10.   def insert(self,val):
  11.     if self.root is None:
  12.       self.root = Node(val)
  13.     else:
  14.       n = self.root
  15.       start = 1
  16.       while True:
  17.         start *= 2
  18.         if n.val > val:
  19.             if n.left:
  20.                 n = n.left
  21.             else:
  22.                 n.left = Node(val)
  23.                 return
  24.         elif n.val < val:
  25.             start += 1
  26.             if n.right:
  27.                 n = n.right
  28.             else:
  29.                 n.right = Node(val)
  30.                 return
  31.         else:
  32.           break
  33.   def get_node(self,x):
  34.       node = self.root
  35.       position = 1
  36.       while position != x:
  37.           ppos = npos = x
  38.           while npos != position:
  39.               ppos = npos
  40.               npos = npos // 2
  41.           node = node.right if ppos&1 else node.left
  42.           if node is None:
  43.               return None
  44.           position = ppos
  45.       return node
  46.   def query(self,a,b):
  47.     if not self.root:
  48.         yield from range(0)
  49.     some_exist = True
  50.     level = 0
  51.     left_cutoff, right_cutoff = -1, -1
  52.     while some_exist:
  53.         some_exist = False
  54.         position = 2 ** level
  55.         end = position * 2
  56.         if right_cutoff >= 0:
  57.             end -= 2**(level - right_cutoff - 1)
  58.         if left_cutoff >= 0:
  59.             position += 2**(level - left_cutoff - 1)
  60.         for node in map(self.get_node,range(position,end)):
  61.             if node is None:
  62.                 continue
  63.             if node.val < a:
  64.                 left_cutoff = level
  65.             elif node.val > b:
  66.                 right_cutoff = level
  67.             else:
  68.                 some_exist = True
  69.                 yield node.val
  70.         level += 1
  71.  
  72. if __name__=="__main__":
  73.     import random
  74.     random.seed(None)
  75.     tree = BST()
  76.     for i in range(1000):
  77.         tree.insert(random.randrange(0,10000))
  78.     a,b = random.randrange(0,9999),random.randrange(0,9999)
  79.     a,b = min(a,b),max(a,b)
  80.     print("Querying range:",a,b)
  81.     for i in tree.query(a,b):print(i)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement