Advertisement
Guest User

Untitled

a guest
Jul 28th, 2016
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. # Node:
  2. # initialized with a certain integer value
  3. # optional argument to make a node a leaf (pass Node(-1))
  4. class Node:
  5. def __init__(self, value, *args):
  6. self._value = value
  7. if(len(args)>0):
  8. self._left = args[0]
  9. self._right = args[0]
  10. else:
  11. self._left = -1
  12. self._right = -1
  13.  
  14. #Tree :
  15. # values : all nodes in tree
  16. # tree_source : the root of the tree
  17. # count : number of nodes
  18. # accessible functions:
  19. # constructor: takes the array to be used in segment tree
  20. # queryRange : get the integer sum of values between two indices
  21. # dfs : print nodes of tree with their neighbors
  22.  
  23. class Tree:
  24. def __init__ (self, inputarray):
  25. endpoint = Node(-1)
  26. self._values = [Node(x, endpoint) for x in inputarray]
  27. self._tree_source = self.buildtree(0, len(self._values)-1)
  28. self._count = len(self._values)
  29.  
  30. def buildtree(self, start, end):
  31. if start==end:
  32. return self._values[start]
  33. else:
  34. leftchild = self.buildtree(start, (start+end)//2)
  35. rightchild = self.buildtree((start+end)//2+1, end)
  36. n = Node(leftchild._value+rightchild._value)
  37. n._left = leftchild
  38. n._right = rightchild
  39. return n
  40.  
  41. #wrapper for queryRange
  42. def queryRange(self, left, right):
  43. return self._queryRange(self._tree_source, 0, (self._count-1) , left, right)
  44.  
  45. #get query between two values by summing up
  46. #all segments within left and right
  47. def _queryRange(self, node, start, end, left, right):
  48. #if the current node's segment is out of the bounds of our query return 0
  49. if right < start or left > end:
  50. return 0
  51.  
  52. #if the segment queried fits inside current
  53. #segment return the segment
  54. elif left<=start and right>= end:
  55. return node._value
  56.  
  57. #get the regions on the left and right
  58. else:
  59. mid= (start+end)//2
  60. return self._queryRange(node._left, start, mid, left, right) + self._queryRange(node._right, mid+1, end, left, right)
  61.  
  62. #wrapper for dfs
  63. def dfs(self):
  64. return self._dfs(self._tree_source, 0)
  65.  
  66. #print nodes
  67. def _dfs(self, source, level):
  68. if(source._left._value==-1 and source._right._value==-1):
  69. print source._value, level, source._left._value, source._right._value
  70.  
  71. else:
  72. if not source._left._value==-1:
  73. self._dfs(source._left, level+1)
  74. if not source._right._value==-1:
  75. self._dfs(source._right, level+1)
  76. print source._value, level, source._left._value, source._right._value
  77.  
  78. t = Tree([1,2,3,4,5,4,5,6])
  79. print str(t.queryRange(3, 6))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement