class SegmentTreeNode:
def __init__(self, start, end):
self.start = start
self.end = end
self.sum = 0
self.left = None
self.right = None
class SegmentTree:
def __init__(self, array):
self.array = array
self.root = self._build_segment_tree(array, 0, len(array)-1)
def _build_segment_tree(self, array, start, end):
# sanity check
if start > end:
return None
cur = SegmentTreeNode(start, end)
#base case single number
if start == end:
cur.sum=array[start]
return cur
mid = start + (end - start)/2
cur.left = self._build_segment_tree(array, start, mid)
cur.right = self._build_segment_tree(array, mid+1, end)
if cur.left is not None:
cur.sum += cur.left.sum
if cur.right is not None:
cur.sum += cur.right.sum
return cur
def update(self, index, value):
diff = value - self.array[index]
self.array[index] = value
cur = self.root
while cur != None:
cur.sum += diff
mid = cur.start + (cur.end-cur.start)/2
if index <= mid:
cur = cur.left
else:
cur = cur.right
def sum(self, start, end):
return self._get_sum_from_tree(self.root, start, end)
def _get_sum_from_tree(self, cur, start, end):
if cur is None or cur.start>end or cur.end<start:
return 0
if cur.start >= start and cur.end <= end:
return cur.sum
return self._get_sum_from_tree(cur.left, start, end) + self._get_sum_from_tree(cur.right, start, end)
# testcase
s_tree = SegmentTree([1,2,3,4,5])
print s_tree.sum(1,2)
s_tree.update(1,3)
print s_tree.sum(1,2)
class TrieTreeNode:
def __init__(self):
self.children = [None]*26
self.is_end = False
self.count = 0
class TrieTree:
def __init__(self):
self.root = TrieTreeNode()
def search(self, word):
cur = self.root
for i in range(len(word)):
index = ord(word[i])=ord('a')
if cur.children[index] is None:
return None
else:
cur = cur.children[index]
return cur.is_end
def add(self, word):
cur = self.root
for i in range(len(word)):
index = ord(word[i])-ord('a')
if cur.children[index] is None:
cur.children[index] = TrieTreeNode()
cur.count += 1
cur = cur.children[index]
cur.is_end = True
def delete(self, word):
self._delete_helper(self.root, word, 0)
def _delete_helper(self, cur, word, index):
if index==len(word):
cur.is_end = False
return
i = ord(word[index])-ord('a')
self._delete_helper(cur.children[i], word, index+1)
if cur.children[i].count == 0:
cur.children[i] = None
cur.count -= 1