How to maintain subtree information using link/cut trees ?

Link/Cut trees are a type of self-adjusting binary search tree that can maintain the subtree information of a tree. Subtree information refers to the size of a subtree or the sum of values of nodes in a subtree. By maintaining subtree information, we can efficiently perform operations on trees, such as finding the kth smallest element, finding the size of a subtree, or finding the sum of values of nodes in a subtree. In this tutorial, we will explain how to maintain subtree information using Link/Cut trees.

Link/Cut trees use a few key operations to maintain subtree information, which is:

Explore Free Engineering Handwritten Notes!

Looking for comprehensive study materials on Python, Data Structures and Algorithms (DSA), Object-Oriented Programming (OOPs), Java, Software Testing, and more?

We earn a commission if you make a purchase, at no additional cost to you.
  1. Access(x): This operation makes x the root of the tree and updates the subtree information for all the nodes on the path from the current root to x.
  2. Cut(x): This operation removes the edge between x and its parent and updates the subtree information for all the nodes on the path from the current root to x.
  3. Link(x, y): This operation adds an edge between x and y, making x the parent of y, and updates the subtree information for all the nodes on the path from the current root to x.

To maintain subtree information using Link/Cut trees, we need to perform the following steps:

Step 1: Define a tree node structure that contains the subtree information and pointers to its parent and children.

Step 2: Implement the Access(x) operation. To do this, we first call the Splay(x) operation, which makes x the root of the tree. Then, we update the subtree information for all the nodes on the path from the previous root to x.

Step 3: Implement the Cut(x) operation. To do this, we first call the Access(x) operation, which makes x the root of the tree. Then, we set the parent of x to null, and update the subtree information for all the nodes on the path from the previous root to x.

Step 4: Implement the Link(x, y) operation. To do this, we first call the Access(y) operation, which makes y the root of its tree. Then, we call the Access(x) operation, which makes x the root of its tree. Finally, we set the parent of y to x, and update the subtree information for all the nodes on the path from the previous roots of x and y to x.

Here is an example implementation of Link/Cut trees in Python:

class Node:
    def __init__(self, val):
        self.val = val
        self.parent = None
        self.left = None
        self.right = None
        self.subtree_size = 1

class LinkCutTree:
    def __init__(self):
        self.null_node = Node(None)
    
    def access(self, x):
        self.splay(x)
        if x.right:
            x.right.parent = None
            x.right.subtree_size += x.subtree_size
            x.right = None
        x.subtree_size = 1
        while x.parent:
            y = x.parent
            self.splay(y)
            if y.right:
                y.right.parent = None
                y.right.subtree_size += y.subtree_size
            y.right = x
            x.parent = y
            x.subtree_size = y.subtree_size - (y.left.subtree_size if y.left else 0) - (x.right.subtree_size if x.right else 0) + 1
            x = y
    
    def cut(self, x):
        self.access(x)
        if x.left:
            x.left.parent = None
            x.left.subtree_size += x.subtree_size
            x.left = None
        else:
            x.parent = None
    
    def link(self,

Leave a Reply