Inorder successor in Binary Tree (original) (raw)

Last Updated : 30 Oct, 2024

Given a binary tree and a node, the task is to find the inorder successor of this node. **Inorder Successor of a node in the binary tree is the next node in the Inorder traversal of the Binary Tree. Inorder Successor is **NULL for the last node in Inorder traversal.

In the below diagram, inorder successor of node 4 is 2, 1 is 3 and 5 is 1.

Table of Content

**Using Reverse Inorder - O(n) Time and O(h) Space

We do a **reverse inorder traversal and keep track of the **last visited node.

If we find the **node and **successor in the right subtree, we return it.

Below is the implementation of above approach:

C++ `

// C++ code for finding the inorder successor // of a target value in a binary tree.

#include <bits/stdc++.h> using namespace std;

class Node { public:
int data; Node* left; Node* right;

Node(int val) {
    data = val;
    left = nullptr;
    right = nullptr;
}

};

// Function to find the inorder successor // of a target value. Node* getSucc(Node* root, int target, Node*& last) {

if (!root) return nullptr;

// If the target and successor are in the
// right subtree
Node* succ = getSucc(root->right, target, last);
if (succ) return succ;

// If root's data matches the target, 
// return the last visited node
if (root->data == target)
    return last;

// Mark the current node as
  // last visited
last = root;

// Search in the left subtree
return getSucc(root->left, target, last);

}

int main() {

// Let's construct the binary tree 
//      1
//    /    \
//   2      3
//  / \    / \
// 4   5  6   7
Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->left = new Node(4);
root->left->right = new Node(5);
root->right->left = new Node(6);
root->right->right = new Node(7);


int target = 4;
Node* last = nullptr;
Node* succ = getSucc(root, target, last);

if (succ)
    cout << succ->data << endl;
else
    cout << "null" << endl;

return 0;

}

Java

// Java code for finding the inorder successor // of a target value in a binary tree.

class Node { int data; Node left, right;

Node(int val) {
    data = val;
    left = null;
    right = null;
}

}

class GfG {

// Function to find the inorder successor
  // of a target value.
static Node getSucc(Node root, int target, Node[] last) {
    if (root == null) return null;

    // If the target and successor are in
      // the right subtree
    Node succ = getSucc(root.right, target, last);
    if (succ != null) return succ;

    // If root's data matches the target, return 
      // the last visited node
    if (root.data == target)
        return last[0];

    // Mark the current node as
      // last visited
    last[0] = root;

    // Search in the left subtree
    return getSucc(root.left, target, last);
}

public static void main(String[] args) {
  
    // Let's construct the binary tree
    //      1
    //    /    \
    //   2      3
    //  / \    / \
    // 4   5  6   7
    Node root = new Node(1);
    root.left = new Node(2);
    root.right = new Node(3);
    root.left.left = new Node(4);
    root.left.right = new Node(5);
    root.right.left = new Node(6);
    root.right.right = new Node(7);

    int target = 4;
    Node[] last = { null };
    Node succ = getSucc(root, target, last);

    if (succ != null)
        System.out.println(succ.data);
    else
        System.out.println("null");
}

}

Python

Python code for finding the inorder successor

of a target value in a binary tree.

class Node: def init(self, val): self.data = val self.left = None self.right = None

Function to find the inorder successor

of a target value.

def get_succ(root, target, last): if not root: return None

# If the target and successor are in the 
# right subtree
succ = get_succ(root.right, target, last)
if succ:
    return succ

# If root's data matches the target, return the 
# last visited node
if root.data == target:
    return last[0]

# Mark the current node as last visited
last[0] = root

# Search in the left subtree
return get_succ(root.left, target, last)

if name == "main":

# Let's construct the binary tree
#      1
#    /    \
#   2      3
#  / \    / \
# 4   5  6   7
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
target = 4
last = [None]
succ = get_succ(root, target, last)

if succ:
    print(succ.data)
else:
    print("null")

C#

// C# code for finding the inorder successor // of a target value in a binary tree.

class Node { public int data; public Node left, right; public Node(int val) { data = val; left = null; right = null; } }

class GfG {

// Function to find the inorder successor of
  // a target value.
static Node GetSucc(Node root, int target, ref Node last) {
    if (root == null) return null;

    // If the target and successor are in
      // the right subtree
    Node succ = GetSucc(root.right, target, ref last);
    if (succ != null) return succ;

    // If root's data matches the target, return
      // the last visited node
    if (root.data == target)
        return last;

    // Mark the current node as last 
      // visited
    last = root;

    // Search in the left subtree
    return GetSucc(root.left, target, ref last);
}

static void Main() {
  
    // Let's construct the binary tree
    //      1
    //    /    \
    //   2      3
    //  / \    / \
    // 4   5  6   7
    Node root = new Node(1);
    root.left = new Node(2);
    root.right = new Node(3);
    root.left.left = new Node(4);
    root.left.right = new Node(5);
    root.right.left = new Node(6);
    root.right.right = new Node(7);
    int target = 4;
    Node last = null;
    Node succ = GetSucc(root, target, ref last);

    if (succ != null)
        System.Console.WriteLine(succ.data);
    else
        System.Console.WriteLine("null");
}

}

JavaScript

// JavaScript code for finding the inorder successor // of a target value in a binary tree.

class Node { constructor(val) { this.data = val; this.left = null; this.right = null; } }

// Function to find the inorder successor // of a target value. function getSucc(root, target, last) { if (!root) return null;

// If the target and successor are in
// the right subtree
let succ = getSucc(root.right, target, last);
if (succ) return succ;

// If root's data matches the target, return
// the last visited node
if (root.data === target)
    return last[0];

// Mark the current node as last visited
last[0] = root;

// Search in the left subtree
return getSucc(root.left, target, last);

}

// Let's construct the binary tree // 1 // /
// 2 3 // / \ /
// 4 5 6 7 let root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.left = new Node(6); root.right.right = new Node(7);

let target = 4; let last = [null]; let succ = getSucc(root, target, last);

if (succ) console.log(succ.data); else console.log("null");

`

Using Morris Traversal - O(n) Time and O(1) Space

We can optimize the auxiliary space used using Morris Traversal (A standard **technique to do **inorder traversal without **stack and **recursion)

Below is the implementation of the above approach:

C++ `

// C++ code for finding the inorder successor // of a target value in a binary tree.

#include <bits/stdc++.h> using namespace std;

class Node { public:
int data; Node* left; Node* right; Node(int val) { data = val; left = nullptr; right = nullptr; } };

// Function to find the inorder successor of // a target value using Morris traversal. Node* getSucc(Node* root, int target) { Node* curr = root; Node* successor = nullptr; bool targetFound = false;

while (curr != nullptr) {
    if (curr->left == nullptr) {
        if (targetFound) {
            return curr;
        }
        if (curr->data == target) {
            targetFound = true;
        }
        curr = curr->right;
    } else {
      
        // Find the inorder predecessor
          // of curr
        Node* pre = curr->left;
        while (pre->right != nullptr 
                   && pre->right != curr) {
            pre = pre->right;
        }

        if (pre->right == nullptr) {
          
            // Make curr the right child 
            // of its inorder predecessor
            pre->right = curr;
            curr = curr->left;
        } else {
          
            // Revert the changes made in the 'if'
            // part to restore the original tree
            pre->right = nullptr;
            if (targetFound) {
                return curr; 
            }
            if (curr->data == target) {
                targetFound = true;
            }
            curr = curr->right;
        }
    }
}

  // If no successor
return nullptr; 

}

int main() {

// Let's construct the binary tree 
//      1
//    /    \
//   2      3
//  / \    / \
// 4   5  6   7
Node* root = new Node(1);
root->left = new Node(2);
root->right = new Node(3);
root->left->left = new Node(4);
root->left->right = new Node(5);
root->right->left = new Node(6);
root->right->right = new Node(7);

int target = 4;
Node* succ = getSucc(root, target);
if (succ)
    cout << succ->data << endl;
else
    cout << "NULL" << endl;

return 0;

}

C

// C code for finding the inorder successor of a // target value in a binary tree using Morris traversal. #include <stdio.h> #include <stdlib.h>

struct Node { int data; struct Node* left; struct Node* right; };

// Function to find the inorder successor // of a target value using Morris traversal. struct Node* getSucc(struct Node* root, int target) { struct Node* curr = root; struct Node* successor = NULL; int targetFound = 0;

while (curr != NULL) {
    if (curr->left == NULL) {
        if (targetFound) {
            return curr;
        }
        if (curr->data == target) {
            targetFound = 1;
        }
        curr = curr->right;
    } else {
      
        // Find the inorder predecessor of curr
        struct Node* pre = curr->left;
        while (pre->right != NULL 
                   && pre->right != curr) {
            pre = pre->right;
        }

        if (pre->right == NULL) {
          
            // Make curr the right child of 
              // its inorder predecessor
            pre->right = curr;
            curr = curr->left;
        } else {
          
            // Revert the changes made in the 'if' 
            // part to restore the original tree
            pre->right = NULL;
            if (targetFound) {
                return curr;
            }
            if (curr->data == target) {
                targetFound = 1;
            }
            curr = curr->right;
        }
    }
}

return NULL;

}

struct Node* createNode(int val) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = val; newNode->left = NULL; newNode->right = NULL; return newNode; }

int main() {

// Let's construct the binary tree
//      1
//    /    \
//   2      3
//  / \    / \
// 4   5  6   7
struct Node* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);

int target = 4;
struct Node* succ = getSucc(root, target);
if (succ != NULL)
    printf("%d\n", succ->data);
else
    printf("NULL\n");

return 0;

}

Java

// Java code for finding the inorder successor of a target // value in a binary tree using Morris traversal. class Node { int data; Node left, right;

Node(int val) {
    data = val;
    left = null;
    right = null;
}

}

class GfG {

// Function to find the inorder successor of
  // a target value using Morris traversal.
static Node getSucc(Node root, int target) {
    Node curr = root;
    Node successor = null;
    boolean targetFound = false;

    while (curr != null) {
        if (curr.left == null) {
            if (targetFound) {
                return curr;
            }
            if (curr.data == target) {
                targetFound = true;
            }
            curr = curr.right;
        } else {
          
            // Find the inorder predecessor 
              // of curr
            Node pre = curr.left;
            while (pre.right != null && 
                   pre.right != curr) {
                pre = pre.right;
            }

            if (pre.right == null) {
              
                // Make curr the right child of 
                  // its inorder predecessor
                pre.right = curr;
                curr = curr.left;
            } else {
              
                // Revert the changes made in the 'if'
                  // part to restore the original tree
                pre.right = null;
                if (targetFound) {
                    return curr;
                }
                if (curr.data == target) {
                    targetFound = true;
                }
                curr = curr.right;
            }
        }
    }

    // If no successor
    return null;
}

public static void main(String[] args) {
  
    // Let's construct the binary tree
    //      1
    //    /    \
    //   2      3
    //  / \    / \
    // 4   5  6   7
    Node root = new Node(1);
    root.left = new Node(2);
    root.right = new Node(3);
    root.left.left = new Node(4);
    root.left.right = new Node(5);
    root.right.left = new Node(6);
    root.right.right = new Node(7);

    int target = 4;
    Node succ = getSucc(root, target);
    if (succ != null)
        System.out.println(succ.data);
    else
        System.out.println("NULL");
}

}

Python

Python code for finding the inorder successor of a

target value in a binary tree using Morris traversal.

class Node: def init(self, val): self.data = val self.left = None self.right = None

Function to find the inorder successor of a

target value using Morris traversal.

def get_succ(root, target): curr = root successor = None target_found = False

while curr:
    if not curr.left:
        if target_found:
            return curr
        if curr.data == target:
            target_found = True
        curr = curr.right
    else:
      
        # Find the inorder predecessor of curr
        pre = curr.left
        while pre.right and pre.right != curr:
            pre = pre.right

        if not pre.right:
          
            # Make curr the right child of 
            # its inorder predecessor
            pre.right = curr
            curr = curr.left
        else:
          
            # Revert the changes made in the 'if' 
            # part to restore the original tree
            pre.right = None
            if target_found:
                return curr
            if curr.data == target:
                target_found = True
            curr = curr.right

# If no successor
return None

if name == "main":

# Let's construct the binary tree
#      1
#    /    \
#   2      3
#  / \    / \
# 4   5  6   7
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)

target = 4
succ = get_succ(root, target)
if succ:
    print(succ.data)
else:
    print("NULL")

C#

// C# code for finding the inorder successor of a target // value in a binary tree using Morris traversal.

class Node { public int data; public Node left, right;

public Node(int val) {
    data = val;
    left = null;
    right = null;
}

}

class GfG {

// Function to find the inorder successor of a 
  // target value using Morris traversal.
static Node GetSucc(Node root, int target) {
    Node curr = root;
    bool targetFound = false;

    while (curr != null) {
        if (curr.left == null) {
            if (targetFound) {
                return curr;
            }
            if (curr.data == target) {
                targetFound = true;
            }
            curr = curr.right;
        } else {
          
            // Find the inorder predecessor
              // of curr
            Node pre = curr.left;
            while (pre.right != null && pre.right != curr) {
                pre = pre.right;
            }

            if (pre.right == null) {
              
                // Make curr the right child of
                  // its inorder predecessor
                pre.right = curr;
                curr = curr.left;
            } else {
              
                // Revert the changes made in the 'if' 
                  // part to restore the original tree
                pre.right = null;
                if (targetFound) {
                    return curr;
                }
                if (curr.data == target) {
                    targetFound = true;
                }
                curr = curr.right;
            }
        }
    }

    // If no successor
    return null;
}

static void Main() {
  
    // Let's construct the binary tree
    //      1
    //    /    \
    //   2      3
    //  / \    / \
    // 4   5  6   7
    Node root = new Node(1);
    root.left = new Node(2);
    root.right = new Node(3);
    root.left.left = new Node(4);
    root.left.right = new Node(5);
    root.right.left = new Node(6);
    root.right.right = new Node(7);

    int target = 4;
    Node succ = GetSucc(root, target);
    if (succ != null)
        System.Console.WriteLine(succ.data);
    else
        System.Console.WriteLine("NULL");
}

}

JavaScript

// JavaScript code for finding the inorder successor // of a target value in a binary tree using Morris // traversal. class Node { constructor(val) { this.data = val; this.left = null; this.right = null; } }

// Function to find the inorder successor of a // target value using Morris traversal. function getSucc(root, target) { let curr = root; let successor = null; let targetFound = false;

while (curr) {
    if (!curr.left) {
        if (targetFound) {
            return curr;
        }
        if (curr.data === target) {
            targetFound = true;
        }
        curr = curr.right;
    }
    else {

        // Find the inorder predecessor
        // of curr
        let pre = curr.left;
        while (pre.right && pre.right !== curr) {
            pre = pre.right;
        }

        if (!pre.right) {
        
                // Make curr the right child of
                // its inorder predecessor
                pre.right = curr;
            curr = curr.left;
        }
        else {

            // Revert the changes made in the 'if'
            // part to restore the original tree
            pre.right = null;
            if (targetFound) {
                return curr;
            }
            if (curr.data === target) {
                targetFound = true;
            }
            curr = curr.right;
        }
    }
}

// If no successor
return null;

}

// Let's construct the binary tree // 1 // /
// 2 3 // / \ /
// 4 5 6 7 let root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.left = new Node(6); root.right.right = new Node(7);

let target = 4; let succ = getSucc(root, target); if (succ) console.log(succ.data); else console.log("NULL");

`

**Using BST tree properties - O(h) Time and O(1) Space

We begin traversal from root. For every node, we need to take care of 3 cases for to find its inorder successor.

Please refer to Inorder Successor in Binary Search Tree for implementation.