File tree Expand file tree Collapse file tree 2 files changed +49
-5
lines changed
pydatastructs/miscellaneous_data_structures Expand file tree Collapse file tree 2 files changed +49
-5
lines changed Original file line number Diff line number Diff line change @@ -86,9 +86,20 @@ def make_root(self, key):
86
86
if self .tree .get (key , None ) is None :
87
87
raise KeyError ("Invalid key, %s" % (key ))
88
88
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
94
105
key_set .parent = key_set
Original file line number Diff line number Diff line change @@ -29,3 +29,36 @@ def test_DisjointSetForest():
29
29
assert dst .find_root (1 ).key == 5
30
30
assert dst .find_root (5 ).key == 5
31
31
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
You can’t perform that action at this time.
0 commit comments