Skip to content

Commit 2ed078f

Browse files
committed
add new file data_structures/binary_tree/segment_tree_node.py add ret type
2 parents 5b892bb + cd6dca2 commit 2ed078f

File tree

1 file changed

+26
-21
lines changed

1 file changed

+26
-21
lines changed

data_structures/binary_tree/segment_tree_node.py

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ def __init__(self, nums: list[int], mode: str='max') -> None:
1616
"""
1717
self.size = len(nums)
1818
self.mode = mode
19-
if mode not in {'max', 'sum'}:
20-
self.mode = 'max' # Default to max if invalid mode is given
19+
if mode not in {"max", "sum"}:
20+
self.mode = "max" # Default to max if invalid mode is given
2121

2222
# Build the tree from the input list
2323
self.root = self.build(0, self.size - 1, nums)
@@ -38,14 +38,14 @@ def build(self, start: int, end: int, nums: list[int]) -> Node:
3838
n = Node(start, end)
3939
n.value = nums[start]
4040
return n
41-
41+
4242
mid = (start + end) // 2
4343
root = Node(start, end)
4444
root.left = self.build(start, mid, nums)
4545
root.right = self.build(mid + 1, end, nums)
4646

4747
# Set the value according to the mode
48-
if self.mode == 'max':
48+
if self.mode == "max":
4949
root.value = max(root.left.value, root.right.value)
5050
else:
5151
root.value = root.left.value + root.right.value
@@ -57,24 +57,24 @@ def max_in_range(self, start_index: int, end_index: int) -> int:
5757
Queries the maximum value in a given range.
5858
Only works in 'max' mode.
5959
"""
60-
if self.mode == 'sum':
61-
raise Exception('Current Segment Tree doesn\'t support finding max')
62-
60+
if self.mode == "sum":
61+
raise Exception("Current Segment Tree doesn't support finding max")
62+
6363
if start_index > end_index or start_index < 0 or end_index >= self.size:
64-
raise Exception('Invalid index')
65-
64+
raise Exception("Invalid index")
65+
6666
return self.query(self.root, start_index, end_index, 0, self.size - 1)
6767

6868
def sum_in_range(self, start_index: int, end_index: int) -> int:
6969
"""
7070
Queries the sum of values in a given range.
7171
Only works in 'sum' mode.
7272
"""
73-
if self.mode == 'max':
74-
raise Exception('Current Segment Tree doesn\'t support summing')
75-
73+
if self.mode == "max":
74+
raise Exception("Current Segment Tree doesn't support summing")
75+
7676
if start_index > end_index or start_index < 0 or end_index >= self.size:
77-
raise Exception('Invalid index')
77+
raise Exception("Invalid index")
7878

7979
return self.query(self.root, start_index, end_index, 0, self.size - 1)
8080

@@ -91,7 +91,7 @@ def query(self, node: Node, start_index: int, end_index: int, start: int, end: i
9191
# Complete overlap
9292
if start_index <= start and end <= end_index:
9393
return node.value
94-
94+
9595
mid = (start + end) // 2
9696

9797
if end_index <= mid:
@@ -102,10 +102,15 @@ def query(self, node: Node, start_index: int, end_index: int, start: int, end: i
102102
return self.query(node.right, start_index, end_index, mid + 1, end)
103103
else:
104104
# Range spans both children
105-
if self.mode == 'max':
106-
return max(self.query(node.left, start_index, end_index, start, mid), self.query(node.right, start_index, end_index, mid + 1, end))
105+
if self.mode == "max":
106+
return max(
107+
self.query(node.left, start_index, end_index, start, mid),
108+
self.query(node.right, start_index, end_index, mid + 1, end),
109+
)
107110
else:
108-
return (self.query(node.left, start_index, end_index, start, mid) + self.query(node.right, start_index, end_index, mid + 1, end))
111+
return self.query(
112+
node.left, start_index, end_index, start, mid
113+
) + self.query(node.right, start_index, end_index, mid + 1, end)
109114

110115
def update(self, index: int, new_value: int) -> int:
111116
"""
@@ -114,8 +119,8 @@ def update(self, index: int, new_value: int) -> int:
114119
:param new_value: New value to set.
115120
"""
116121
if index < 0 or index >= self.size:
117-
raise Exception('Invalid index')
118-
122+
raise Exception("Invalid index")
123+
119124
self.modify(self.root, index, new_value, 0, self.size - 1)
120125

121126
def modify(self, node: Node, index: int, new_value: int, start: int, end: int) -> int:
@@ -137,9 +142,9 @@ def modify(self, node: Node, index: int, new_value: int, start: int, end: int) -
137142
self.modify(node.left, index, new_value, start, mid)
138143
else:
139144
self.modify(node.right, index, new_value, mid + 1, end)
140-
145+
141146
# Recompute current node's value after update
142-
if self.mode == 'max':
147+
if self.mode == "max":
143148
node.value = max(node.left.value, node.right.value)
144149
else:
145150
node.value = node.left.value + node.right.value

0 commit comments

Comments
 (0)