Skip to content

Commit 0f8e381

Browse files
committed
maintain tree
1 parent 28a4d0b commit 0f8e381

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

pydatastructs/miscellaneous_data_structures/disjoint_set.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,20 @@ def make_root(self, key):
8686
if self.tree.get(key, None) is None:
8787
raise KeyError("Invalid key, %s"%(key))
8888

89-
current_root = self.find_root(key)
90-
if current_root.key != key:
91-
key_set = self.tree[key]
92-
current_root.parent = key_set
93-
key_set.size = current_root.size
89+
key_set = self.tree[key]
90+
if key_set.parent is not key_set:
91+
current_parent = key_set.parent
92+
# Remove this key subtree size from all its ancestors
93+
while current_parent.parent is not current_parent:
94+
current_parent.size -= key_set.size
95+
current_parent = current_parent.parent
96+
97+
all_set_size = current_parent.size # This is the root node
98+
current_parent.size -= key_set.size
99+
100+
# Make parent of current root as key
101+
current_parent.parent = key_set
102+
# size of new root will be same as previous root's size
103+
key_set.size = all_set_size
104+
# Make parent of key as itself
94105
key_set.parent = key_set

pydatastructs/miscellaneous_data_structures/tests/test_disjoint_set.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,36 @@ def test_DisjointSetForest():
2929
assert dst.find_root(1).key == 5
3030
assert dst.find_root(5).key == 5
3131
assert raises(KeyError, lambda: dst.make_root(9))
32+
33+
dst = DisjointSetForest()
34+
for i in range(6):
35+
dst.make_set(i)
36+
assert dst.tree[2].size == 1
37+
dst.union(2, 3)
38+
assert dst.tree[2].size == 2
39+
assert dst.tree[3].size == 1
40+
dst.union(1, 4)
41+
dst.union(2, 4)
42+
# current tree
43+
###############
44+
# 2
45+
# / \
46+
# 1 3
47+
# /
48+
# 4
49+
###############
50+
assert dst.tree[2].size == 4
51+
assert dst.tree[1].size == 2
52+
assert dst.tree[3].size == dst.tree[4].size == 1
53+
dst.make_root(4)
54+
# New tree
55+
###############
56+
# 4
57+
# |
58+
# 2
59+
# / \
60+
# 1 3
61+
###############
62+
assert dst.tree[4].size == 4
63+
assert dst.tree[2].size == 3
64+
assert dst.tree[1].size == dst.tree[3].size == 1

0 commit comments

Comments
 (0)