Program to fix a erroneous binary tree using Python

When a binary tree has an erroneous connection where a node's right child pointer incorrectly points to another node at the same level, we need to identify and fix this error. The solution involves detecting the problematic node and removing it along with its descendants, except for the node it erroneously points to.

Consider this example where node 4's right child incorrectly points to node 6:

5 3 7 2 4 6 8 Erroneous link from 4 to 6 Node 4 will be removed

Algorithm

The algorithm uses breadth-first traversal to detect cycles caused by erroneous links ?

  • Use a deque to perform level-order traversal
  • Track parent relationships and whether each child is left or right
  • Maintain a visited set to detect when we encounter a node twice
  • When a duplicate is found, remove the erroneous connection by setting the grandparent's pointer to null

Implementation

import collections

class TreeNode:
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right

def insert(temp, data):
    que = []
    que.append(temp)
    while len(que):
        temp = que[0]
        que.pop(0)
        if not temp.left:
            if data is not None:
                temp.left = TreeNode(data)
            else:
                temp.left = TreeNode(0)
            break
        else:
            que.append(temp.left)
            if not temp.right:
                if data is not None:
                    temp.right = TreeNode(data)
                else:
                    temp.right = TreeNode(0)
                break
            else:
                que.append(temp.right)

def make_tree(elements):
    tree = TreeNode(elements[0])
    for element in elements[1:]:
        insert(tree, element)
    return tree

def search_node(root, element):
    if root == None:
        return None
    if root.data == element:
        return root
    res1 = search_node(root.left, element)
    if res1:
        return res1
    res2 = search_node(root.right, element)
    return res2

def print_tree(root):
    if root is not None:
        print_tree(root.left)
        print(root.data, end=', ')
        print_tree(root.right)

def solve(root):
    q = collections.deque([root])
    p, visited = dict(), set()
    while q:
        cur = q.popleft()
        if cur in visited:
            grand_p, is_left = p[p[cur][0]]
            if is_left:
                grand_p.left = None
            else:
                grand_p.right = None
            return root
        visited.add(cur)
        if cur.left:
            p[cur.left] = (cur, 1)
            q.append(cur.left)
        if cur.right:
            p[cur.right] = (cur, 0)
            q.append(cur.right)
    return root

# Create tree and introduce erroneous link
root = make_tree([5, 3, 7, 2, 4, 6, 8])
link_from = search_node(root, 4)
link_to = search_node(root, 6)
link_from.right = link_to

# Fix the tree and print result
print("Fixed tree (inorder): ", end="")
print_tree(solve(root))
Fixed tree (inorder): 2, 3, 5, 6, 7, 8,

How It Works

The algorithm performs a breadth-first search while tracking parent-child relationships. When it encounters a node that has already been visited, it identifies this as the target of an erroneous link. The algorithm then traces back through the parent map to find the grandparent node and removes the erroneous connection by setting the appropriate child pointer to null.

In our example, node 4 erroneously points to node 6. When the algorithm encounters node 6 for the second time, it removes node 4 from the tree, resulting in the corrected inorder traversal: 2, 3, 5, 6, 7, 8.

Conclusion

This approach efficiently detects and fixes erroneous binary tree connections using breadth-first traversal and cycle detection. The algorithm maintains tree integrity by removing problematic nodes while preserving the overall structure.

Updated on: 2026-03-25T21:06:55+05:30

287 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements