package main import "fmt" func find(parent []int, x int) int { if parent[x] != x { parent[x] = find(parent, parent[x]) } return parent[x] } func main() { parent := []int{0, 1, 2, 3, 4} parent[1] = 0 parent[2] = 1 parent[3] = 2 fmt.Println(find(parent, 3)) fmt.Println(parent) }
The find function recursively finds the root of node 3, which is 0. During this process, it updates the parent of nodes 3, 2, and 1 to 0, compressing the path. So the parent slice becomes [0 0 0 0 4].
Path compression makes every node on the find path point directly to the root, flattening the tree and speeding up future find operations.
package main import "fmt" func find(parent []int, x int) int { if parent[x] == x { return x } parent[x] = find(parent, parent[x]) return parent[x] } func main() { parent := []int{0, 1, 2} parent[1] = 2 parent[2] = 1 fmt.Println(find(parent, 1)) }
The parent array has a cycle between nodes 1 and 2, causing infinite recursion in find and a stack overflow error.
package main import "fmt" func find(parent []int, x int) int { if parent[x] != x { parent[x] = find(parent, parent[x]) } return parent[x] } func union(parent []int, x, y int) { rootX := find(parent, x) rootY := find(parent, y) if rootX != rootY { parent[rootY] = rootX } } func main() { parent := []int{0, 1, 2, 3, 4} union(parent, 0, 1) union(parent, 1, 2) union(parent, 3, 4) count := 0 for i := 0; i < 5; i++ { if parent[i] == i { count++ } } fmt.Println(count) }
After unions, sets are {0,1,2} and {3,4}. The code counts parents equal to index, which is 2 because parent array is [0 0 0 3 3]. So roots are 0 and 3, count is 2.
package main import "fmt" func find(parent []int, x int) int { if parent[x] != x { parent[x] = find(parent, parent[x]) } return parent[x] } func main() { parent := []int{0, 1, 2, 3, 4, 5} parent[1] = 0 parent[2] = 1 parent[3] = 2 parent[4] = 3 parent[5] = 4 _ = find(parent, 5) _ = find(parent, 3) fmt.Println(parent) }
Calling find on 5 compresses the path 5->4->3->2->1->0, updating all parents to 0. Then find on 3 also confirms parent[3] = 0. Final parent array is all zeros except for 0 itself.
