| // SPDX-License-Identifier: GPL-2.0 |
| #include <linux/union_find.h> |
| |
| /** |
| * uf_find - Find the root of a node and perform path compression |
| * @node: the node to find the root of |
| * |
| * This function returns the root of the node by following the parent |
| * pointers. It also performs path compression, making the tree shallower. |
| * |
| * Returns the root node of the set containing node. |
| */ |
| struct uf_node *uf_find(struct uf_node *node) |
| { |
| struct uf_node *parent; |
| |
| while (node->parent != node) { |
| parent = node->parent; |
| node->parent = parent->parent; |
| node = parent; |
| } |
| return node; |
| } |
| |
| /** |
| * uf_union - Merge two sets, using union by rank |
| * @node1: the first node |
| * @node2: the second node |
| * |
| * This function merges the sets containing node1 and node2, by comparing |
| * the ranks to keep the tree balanced. |
| */ |
| void uf_union(struct uf_node *node1, struct uf_node *node2) |
| { |
| struct uf_node *root1 = uf_find(node1); |
| struct uf_node *root2 = uf_find(node2); |
| |
| if (root1 == root2) |
| return; |
| |
| if (root1->rank < root2->rank) { |
| root1->parent = root2; |
| } else if (root1->rank > root2->rank) { |
| root2->parent = root1; |
| } else { |
| root2->parent = root1; |
| root1->rank++; |
| } |
| } |