1
- # https://www.algoexpert.io/questions/BST%20Construction
2
-
1
+ # My solution. Failing on 2 test case but do't know why
3
2
class BST :
4
3
def __init__ (self , value ):
5
4
self .left = None
@@ -21,15 +20,15 @@ def insert(self, value):
21
20
22
21
def contains (self , value ):
23
22
if value < self .value :
24
- if self .value is None :
23
+ if self .left is None :
25
24
return False
26
25
else :
27
26
self .left .contains (value )
28
27
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 )
33
32
else :
34
33
return True
35
34
@@ -54,7 +53,7 @@ def remove(self, value, parent = None):
54
53
self .left = self .right .left
55
54
self .right = self .right .right
56
55
else :
57
- self . value = None
56
+ pass # This is a single-node tree. nothing to do
58
57
elif parent .left == self :
59
58
parent .left = self .left if self .left is not None else self .right
60
59
elif parent .right == self :
@@ -67,3 +66,119 @@ def get_min_value(self):
67
66
else :
68
67
return self .left .get_min_value ()
69
68
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
0 commit comments