Skip to content

Commit a476b38

Browse files
committed
Merge pull request laurentluce#2 from imgemp/master
Enabled root deletion for zero and one child roots
2 parents a84487b + eaf6bf7 commit a476b38

File tree

2 files changed

+42
-16
lines changed

2 files changed

+42
-16
lines changed

algorithms/binary_tree.py

+26-16
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,19 @@ def insert(self, data):
1818
1919
@param data node data object to insert
2020
"""
21-
if data < self.data:
22-
if self.left is None:
23-
self.left = Node(data)
24-
else:
25-
self.left.insert(data)
26-
elif data > self.data:
27-
if self.right is None:
28-
self.right = Node(data)
29-
else:
30-
self.right.insert(data)
21+
if self.data:
22+
if data < self.data:
23+
if self.left is None:
24+
self.left = Node(data)
25+
else:
26+
self.left.insert(data)
27+
elif data > self.data:
28+
if self.right is None:
29+
self.right = Node(data)
30+
else:
31+
self.right.insert(data)
32+
else:
33+
self.data = data
3134

3235
def lookup(self, data, parent=None):
3336
"""
@@ -60,11 +63,14 @@ def delete(self, data):
6063
children_count = node.children_count()
6164
if children_count == 0:
6265
# if node has no children, just remove it
63-
if parent.left is node:
64-
parent.left = None
66+
if parent:
67+
if parent.left is node:
68+
parent.left = None
69+
else:
70+
parent.right = None
71+
del node
6572
else:
66-
parent.right = None
67-
del node
73+
self.data = None
6874
elif children_count == 1:
6975
# if node has 1 child
7076
# replace node by its child
@@ -77,7 +83,11 @@ def delete(self, data):
7783
parent.left = n
7884
else:
7985
parent.right = n
80-
del node
86+
del node
87+
else:
88+
self.left = n.left
89+
self.right = n.right
90+
self.data = n.data
8191
else:
8292
# if node has 2 children
8393
# find its successor
@@ -157,4 +167,4 @@ def children_count(self):
157167
cnt += 1
158168
if self.right:
159169
cnt += 1
160-
return cnt
170+
return cnt

algorithms/tests/test_binary_tree.py

+16
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,22 @@ def test_binary_tree(self):
6464
t.append(d)
6565
self.assertEquals(t, [7, 10, 11, 14, 17])
6666

67+
# check for root deletion
68+
root = binary_tree.Node(1)
69+
root.insert(2)
70+
root.insert(0)
71+
root.delete(1)
72+
self.assertEquals(root.data, 2)
73+
root.delete(2)
74+
self.assertEquals(root.data, 0)
75+
root.delete(0)
76+
self.assertEquals(root.data, None)
77+
root.insert(1)
78+
self.assertEquals(root.data, 1)
79+
self.assertEquals(root.left, None)
80+
self.assertEquals(root.right, None)
81+
82+
6783
if __name__ == '__main__':
6884
unittest.main()
6985

0 commit comments

Comments
 (0)