Skip to content

Commit 58b5a90

Browse files
author
Partho Biswas
committed
no message
1 parent 2ff0576 commit 58b5a90

File tree

2 files changed

+128
-16
lines changed

2 files changed

+128
-16
lines changed

algoexpert.io/python/BST_Construction_Recursive.py

Lines changed: 123 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
# https://www.algoexpert.io/questions/BST%20Construction
2-
1+
# My solution. Failing on 2 test case but do't know why
32
class BST:
43
def __init__(self, value):
54
self.left = None
@@ -21,15 +20,15 @@ def insert(self, value):
2120

2221
def contains(self, value):
2322
if value < self.value:
24-
if self.value is None:
23+
if self.left is None:
2524
return False
2625
else:
2726
self.left.contains(value)
2827
elif value > self.value:
29-
if self.right is None:
30-
return False
31-
else:
32-
self.right.contains(value)
28+
if self.right is None:
29+
return False
30+
else:
31+
return self.right.contains(value)
3332
else:
3433
return True
3534

@@ -54,7 +53,7 @@ def remove(self, value, parent = None):
5453
self.left = self.right.left
5554
self.right = self.right.right
5655
else:
57-
self.value = None
56+
pass # This is a single-node tree. nothing to do
5857
elif parent.left == self:
5958
parent.left = self.left if self.left is not None else self.right
6059
elif parent.right == self:
@@ -67,3 +66,119 @@ def get_min_value(self):
6766
else:
6867
return self.left.get_min_value()
6968

69+
70+
71+
72+
# Source: https://tinyurl.com/rxnq4sz
73+
def traverse_list(node):
74+
visit_order = list()
75+
if node:
76+
visit_order.append(node.value)
77+
visit_order += traverse_list(node.left)
78+
visit_order += traverse_list(node.right)
79+
return visit_order
80+
81+
82+
def traverse(node):
83+
visit_order = list()
84+
if node:
85+
visit_order.append(node)
86+
visit_order += traverse(node.left)
87+
visit_order += traverse(node.right)
88+
return visit_order
89+
90+
91+
def get_min_node_value(node):
92+
while node.left:
93+
node = node.left
94+
return node.value
95+
96+
97+
class BST:
98+
def __init__(self, value):
99+
self.value = value
100+
self.left = None
101+
self.right = None
102+
103+
def compare(self, target):
104+
if self.value > target:
105+
return -1
106+
elif self.value < target:
107+
return 1
108+
else:
109+
return 0
110+
111+
def insert(self, value):
112+
113+
node = self
114+
while True:
115+
comparision = node.compare(value)
116+
if comparision == -1:
117+
if node.left:
118+
node = node.left
119+
else:
120+
node.left = BST(value)
121+
break
122+
else: # comparision == 1 or equals
123+
if node.right:
124+
node = node.right
125+
else:
126+
node.right = BST(value)
127+
break
128+
129+
return self
130+
131+
def contains(self, value):
132+
node = self
133+
while node:
134+
comparision = node.compare(value)
135+
if comparision == -1:
136+
node = node.left
137+
elif comparision == 1:
138+
node = node.right
139+
else:
140+
return True
141+
142+
return False
143+
144+
def remove(self, value, parent_node=None):
145+
node = self
146+
while True:
147+
comparision = node.compare(value)
148+
if comparision == -1:
149+
if node.left:
150+
parent_node = node
151+
node = node.left
152+
else:
153+
print('Value not found')
154+
break
155+
elif comparision == 1:
156+
if node.right:
157+
parent_node = node
158+
node = node.right
159+
else:
160+
print('Value not found')
161+
break
162+
else:
163+
if node.left and node.right: # node with left and child
164+
node.value = get_min_node_value(node.right)
165+
node.right.remove(node.value, node)
166+
elif parent_node is None: # parent node
167+
if node.left:
168+
node.value = node.left.value
169+
node.right = node.left.right
170+
node.left = node.left.left
171+
elif node.right:
172+
node.value = node.right.value
173+
node.left = node.right.left
174+
node.right = node.right.right
175+
else: # parent node with no children
176+
node.value = None
177+
178+
elif parent_node.left == node: # found in the left node with right None
179+
parent_node.left = node.left if node.left else node.right
180+
elif parent_node.right == node: # found in the right node with left None
181+
parent_node.right = node.left if node.left else node.right
182+
break
183+
184+
return self
Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
1-
2-
31
# Time O(n) | Space O(logn)
42
def maxPathSum(tree):
53
_, maxSum = findMaxSum(tree)
64
return maxSum
75

6+
87
def findMaxSum(tree):
98
if tree is None:
109
return (0, 0)
11-
1210
leftMaxSumAsBranch, leftMaxPathSum = findMaxSum(tree.left)
1311
rightMaxSumAsBranch, rightMaxPathSum = findMaxSum(tree.right)
1412
maxChildSumAsBranch = max(leftMaxSumAsBranch, rightMaxSumAsBranch)
1513

1614
value = tree.value
17-
maxSumAsBranch = max(maxChildSumAsBranch + value, value)
18-
# max path sum for triangle path which includes root as node
19-
maxSumAsRootNode = max(leftMaxSumAsBranch + value + rightMaxSumAsBranch, maxSumAsBranch)
20-
maxPathSum = max(leftMaxPathSum, rightMaxPathSum, maxSumAsRootNode)
15+
maxSumAsBrach = max(maxChildSumAsBranch + value, value)
16+
maxSumAsRootNoode = max(leftMaxSumAsBranch + value + rightMaxSumAsBranch, maxSumAsBrach)
17+
maxPathSum = max(leftMaxPathSum, rightMaxPathSum, maxSumAsRootNoode)
2118

22-
return (maxSumAsBranch, maxPathSum)
19+
return (maxSumAsBrach, maxPathSum)

0 commit comments

Comments
 (0)