Inorder Sucesor de un Node en Binary Tree

Dado un árbol binario y un Node, necesitamos escribir un programa para encontrar el sucesor en orden de este Node.
Inorder El sucesor de un Node en el árbol binario es el siguiente Node en el recorrido Inorder del árbol binario. Sucesor en orden es NULL para el último Node en el recorrido en orden.

En el diagrama anterior, el sucesor en orden del Node 4 es 2 y el Node 5 es 1 .

Ya hemos discutido cómo encontrar el sucesor en orden de un Node en Binary Search Tree . No podemos usar el mismo enfoque para encontrar el sucesor en orden en árboles binarios generales.

Necesitamos ocuparnos de 3 casos para que cualquier Node encuentre su sucesor en orden como se describe a continuación:  

  1. El hijo derecho del Node no es NULL. Si el hijo derecho del Node no es NULL, entonces el sucesor en orden de este Node será el Node más a la izquierda en su subárbol derecho.
  2. El hijo derecho del Node es NULL. Si el hijo derecho del Node es NULL. Luego seguimos encontrando el padre del Node dado x, digamos p tal que p->left = x. Por ejemplo, en el árbol anterior, el sucesor en orden del Node 5 será 1 . El primer padre de 5 es 2 pero 2->left != 5. Entonces, el siguiente padre de 2 es 1, ahora 1->left = 2. Por lo tanto, el sucesor en orden de 5 es 1. 
    A continuación se muestra el algoritmo para este caso: 
    • Supongamos que el Node dado es x . Comience a atravesar el árbol desde el Node raíz para encontrar x recursivamente.
    • Si root == x , detenga la recursión; de lo contrario, encuentre x recursivamente para los subárboles izquierdo y derecho.
    • Ahora, después de encontrar el Node x , la recursividad retrocederá hasta la raíz . Cada llamada recursiva devolverá el Node a la función de llamada, almacenaremos esto en un Node temporal, por ejemplo , temp . Ahora, cuando retroceda a su padre, que será root ahora, verifique si root.left = temp, si no, mantenga subiendo
  3. Si el Node es el Node más a la derecha. Si el Node es el Node más a la derecha en el árbol dado. Por ejemplo, en el árbol anterior, el Node 6 es el Node más a la derecha. En este caso, no habrá sucesor en orden de este Node. es decir, el sucesor en orden del Node más a la derecha en un árbol es NULL.

A continuación se muestra la implementación del enfoque anterior:  

C++

// CPP program to find inorder successor of a node
#include<bits/stdc++.h>
using namespace std;
 
// A Binary Tree Node
struct Node
{
    int data;
    struct Node *left, *right;
};
 
// Temporary node for case 2
Node* temp = new Node;
 
// Utility function to create a new tree node
Node* newNode(int data)
{
    Node *temp = new Node;
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}
 
// function to find left most node in a tree
Node* leftMostNode(Node* node)
{
    while (node != NULL && node->left != NULL)
        node = node->left;
    return node;
}
 
// function to find right most node in a tree
Node* rightMostNode(Node* node)
{
    while (node != NULL && node->right != NULL)
        node = node->right;
    return node;
}
 
// recursive function to find the Inorder Successor
// when the right child of node x is NULL
Node* findInorderRecursive(Node* root, Node* x )
{
    if (!root)
        return NULL;
 
    if (root==x || (temp = findInorderRecursive(root->left,x)) ||
                   (temp = findInorderRecursive(root->right,x)))
    {
        if (temp)
        {
            if (root->left == temp)
            {
                cout << "Inorder Successor of " << x->data;
                cout << " is "<< root->data << "\n";
                return NULL;
            }
        }
 
        return root;
    }
 
    return NULL;
}
 
// function to find inorder successor of
// a node
void inorderSuccessor(Node* root, Node* x)
{
    // Case1: If right child is not NULL
    if (x->right != NULL)
    {
        Node* inorderSucc = leftMostNode(x->right);
        cout<<"Inorder Successor of "<<x->data<<" is ";
        cout<<inorderSucc->data<<"\n";
    }
 
    // Case2: If right child is NULL
    if (x->right == NULL)
    {   
        Node* rightMost = rightMostNode(root);
 
        // case3: If x is the right most node
        if (rightMost == x)
            cout << "No inorder successor! Right most node.\n";
        else
            findInorderRecursive(root, x);
    }
}
 
// Driver program to test above functions
int main()
{
    // Let's construct the binary tree
    //          1
    //    /    \
    //   2      3
    //  / \    / \
    // 4   5  6   7
    Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
      root->right->left = newNode(6);
    root->right->right = newNode(7);
 
    // Case 1 : When there is a right child
    // eg: Node(1) has a right child ergo the inorder successor would be leftmost
      // node of the right subtree ie 6.
    inorderSuccessor(root, root);
 
    // case 2: When the right child is NULL
      // eg: From the above figure Node(5) satisfies this case
    inorderSuccessor(root, root->left->left);
 
    // case 3: When the node is the rightmost node of the binary tree
    inorderSuccessor(root, root->right->right);
 
    return 0;
}

Java

// Java program to find inorder successor of a node
class Solution
{
// A Binary Tree Node
 static class Node
{
    int data;
     Node left, right;
}
 
// Temporary node for case 2
static Node temp = new Node();
 
// Utility function to create a new tree node
static Node newNode(int data)
 {
    Node temp = new Node();
    temp.data = data;
    temp.left = temp.right = null;
    return temp;
}
 
// function to find left most node in a tree
static Node leftMostNode(Node node)
 {
    while (node != null && node.left != null)
        node = node.left;
    return node;
}
 
// function to find right most node in a tree
static Node rightMostNode(Node node)
 {
    while (node != null && node.right != null)
        node = node.right;
    return node;
}
 
// recursive function to find the Inorder Successor
// when the right child of node x is null
static Node findInorderRecursive(Node root, Node x )
 {
    if (root==null)
        return null;
 
    if (root==x || (temp = findInorderRecursive(root.left,x))!=null ||
                (temp = findInorderRecursive(root.right,x))!=null)
    {
        if (temp!=null)
        {
            if (root.left == temp)
            {
                System.out.print( "Inorder Successor of "+x.data);
                System.out.print( " is "+ root.data + "\n");
                return null;
            }
        }
 
        return root;
    }
 
    return null;
}
 
// function to find inorder successor of
// a node
static void inorderSuccessor(Node root, Node x)
 {
    // Case1: If right child is not null
    if (x.right != null)
    {
        Node inorderSucc = leftMostNode(x.right);
        System.out.print("Inorder Successor of "+x.data+" is ");
        System.out.print(inorderSucc.data+"\n");
    }
 
    // Case2: If right child is null
    if (x.right == null)
    {    
        int f = 0;
         
        Node rightMost = rightMostNode(root);
 
        // case3: If x is the right most node
        if (rightMost == x)
            System.out.print("No inorder successor! Right most node.\n");
        else
            findInorderRecursive(root, x);
    }
}
 
// Driver program to test above functions
public static void main(String args[])
{
    // Let's construct the binary tree
    // as shown in above diagram
 
    Node root = newNode(1);
    root.left = newNode(2);
    root.right = newNode(3);
    root.left.left = newNode(4);
    root.left.right = newNode(5);
    root.right.right = newNode(6);
 
    // Case 1
    inorderSuccessor(root, root.right);
 
    // case 2
    inorderSuccessor(root, root.left.left);
 
    // case 3
    inorderSuccessor(root, root.right.right);
 
}
}
//contributed by Arnab Kundu

Python3

""" Python3 code for inorder successor
and predecessor of tree """
 
# A Binary Tree Node
# Utility function to create a new tree node
class newNode:
 
    # Constructor to create a new node
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
# function to find left most node in a tree
def leftMostNode(node):
 
    while (node != None and node.left != None):
        node = node.left
    return node
 
# function to find right most node in a tree
def rightMostNode(node):
    while (node != None and node.right != None):
        node = node.right
    return node
 
# recursive function to find the Inorder Successor
# when the right child of node x is None
def findInorderRecursive(root, x ):
 
    if (not root):
        return None
    if (root == x or (findInorderRecursive(root.left, x)) or
                     (findInorderRecursive(root.right, x))):
        if findInorderRecursive(root.right, x):
            temp=findInorderRecursive(root.right, x)
        else:
            temp=findInorderRecursive(root.left, x)
        if (temp):
         
            if (root.left == temp):
             
                print("Inorder Successor of",
                            x.data, end = "")
                print(" is", root.data)
                return None   
        return root
    return None
 
# function to find inorder successor
# of a node
def inorderSuccessor(root, x):
     
    # Case1: If right child is not None
    if (x.right != None) :
        inorderSucc = leftMostNode(x.right)
        print("Inorder Successor of", x.data,
                             "is", end = " ")
        print(inorderSucc.data)
         
    # Case2: If right child is None
    if (x.right == None):
        f = 0
        rightMost = rightMostNode(root)
 
        # case3: If x is the right most node
        if (rightMost == x):
            print("No inorder successor!",
                       "Right most node.")
        else:
            findInorderRecursive(root, x)
     
# Driver Code
if __name__ == '__main__':
 
    root = newNode(1)
    root.left = newNode(2)
    root.right = newNode(3)
    root.left.left = newNode(4)
    root.left.right = newNode(5)
    root.right.right = newNode(6)
 
    # Case 1
    inorderSuccessor(root, root.right)
 
    # case 2
    inorderSuccessor(root, root.left.left)
 
    # case 3
    inorderSuccessor(root, root.right.right)
 
# This code is contributed
# by SHUBHAMSINGH10

C#

// C# program to find inorder
// successor of a node
using System;
 
class GFG
{
     
// A Binary Tree Node
public class Node
{
    public int data;
    public Node left, right;
}
 
// Temporary node for case 2
public static Node temp = new Node();
 
// Utility function to create
// a new tree node
public static Node newNode(int data)
{
    Node temp = new Node();
    temp.data = data;
    temp.left = temp.right = null;
    return temp;
}
 
// function to find left most
// node in a tree
public static Node leftMostNode(Node node)
{
    while (node != null &&
        node.left != null)
    {
        node = node.left;
    }
    return node;
}
 
// function to find right most
// node in a tree
public static Node rightMostNode(Node node)
{
    while (node != null &&
        node.right != null)
    {
        node = node.right;
    }
    return node;
}
 
// recursive function to find the
// Inorder Successor when the right
// child of node x is null
public static Node findInorderRecursive(Node root,
                                        Node x)
{
    if (root == null)
    {
        return null;
    }
 
    if (root == x ||
    (temp = findInorderRecursive(root.left, x)) != null ||
    (temp = findInorderRecursive(root.right, x)) != null)
    {
        if (temp != null)
        {
            if (root.left == temp)
            {
                Console.Write("Inorder Successor of " + x.data);
                Console.Write(" is " + root.data + "\n");
                return null;
            }
        }
 
        return root;
    }
 
    return null;
}
 
// function to find inorder successor
// of a node
public static void inorderSuccessor(Node root, Node x)
{
    // Case1: If right child is not null
    if (x.right != null)
    {
        Node inorderSucc = leftMostNode(x.right);
        Console.Write("Inorder Successor of " +
                            x.data + " is ");
        Console.Write(inorderSucc.data + "\n");
    }
 
    // Case2: If right child is null
    if (x.right == null)
    {
        int f = 0;
 
        Node rightMost = rightMostNode(root);
 
        // case3: If x is the right most node
        if (rightMost == x)
        {
            Console.Write("No inorder successor! " +
                            "Right most node.\n");
        }
        else
        {
            findInorderRecursive(root, x);
        }
    }
}
 
// Driver Code
public static void Main(string[] args)
{
    // Let's construct the binary tree
    // as shown in above diagram
    Node root = newNode(1);
    root.left = newNode(2);
    root.right = newNode(3);
    root.left.left = newNode(4);
    root.left.right = newNode(5);
    root.right.right = newNode(6);
 
    // Case 1
    inorderSuccessor(root, root.right);
 
    // case 2
    inorderSuccessor(root, root.left.left);
 
    // case 3
    inorderSuccessor(root, root.right.right);
}
}
 
// This code is contributed by Shrikant13

Javascript

<script>
// Javascript program to find inorder successor of a node
 
// A Binary Tree Node
class Node
{
    constructor(data)
    {
        this.data=data;
        this.left=this.right=null;
    }
}
 
// Temporary node for case 2
let temp = new Node();
 
// function to find left most node in a tree
function leftMostNode(node)
{
     while (node != null && node.left != null)
        node = node.left;
    return node;
}
 
// function to find right most node in a tree   
function rightMostNode(node)
{
    while (node != null && node.right != null)
        node = node.right;
    return node;
}
 
// recursive function to find the Inorder Successor
// when the right child of node x is null
function findInorderRecursive(root,x)
{
    if (root==null)
        return null;
  
    if (root==x || (temp = findInorderRecursive(root.left,x))!=null ||
                (temp = findInorderRecursive(root.right,x))!=null)
    {
        if (temp!=null)
        {
            if (root.left == temp)
            {
                document.write( "Inorder Successor of "+x.data);
                document.write( " is "+ root.data + "<br>");
                return null;
            }
        }
  
        return root;
    }
  
    return null;
}
 
// function to find inorder successor of
// a node
function inorderSuccessor(root,x)
{
    // Case1: If right child is not null
    if (x.right != null)
    {
        let inorderSucc = leftMostNode(x.right);
        document.write("Inorder Successor of "+x.data+" is ");
        document.write(inorderSucc.data+"<br>");
    }
  
    // Case2: If right child is null
    if (x.right == null)
    {   
        let f = 0;
          
        let rightMost = rightMostNode(root);
  
        // case3: If x is the right most node
        if (rightMost == x)
            document.write("No inorder successor! Right most node.\n");
        else
            findInorderRecursive(root, x);
    }
}
 
 
// Driver program to test above functions
// Let's construct the binary tree
// as shown in above diagram
 
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.right = new Node(6);
 
// Case 1
inorderSuccessor(root, root.right);
 
// case 2
inorderSuccessor(root, root.left.left);
 
// case 3
inorderSuccessor(root, root.right.right);
 
 
// This code is contributed by avanitrachhadiya2155
</script>

Producción: 

Inorder Successor of 1 is 6
Inorder Successor of 4 is 2
No inorder successor! Right most node.

Otro enfoque: 
haremos un recorrido en orden inverso y mantendremos el seguimiento del Node visitado actual. Una vez que encontramos el elemento, el último elemento rastreado sería nuestra respuesta.

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ Program to find inorder successor.
#include<bits/stdc++.h>
using namespace std;
 
// structure of a Binary Node.
struct Node
{
    int data;
    Node* left;
    Node* right;
};
 
// Function to create a new Node.
Node* newNode(int val)
{
    Node* temp = new Node;
    temp->data = val;
    temp->left = NULL;
    temp->right = NULL;
     
    return temp;
}
 
// function that prints the inorder successor
// of a target node. next will point the last
// tracked node, which will be the answer.
void inorderSuccessor(Node* root,
                      Node* target_node,
                      Node* &next)
{
    // if root is null then return
    if(!root)
        return;
 
    inorderSuccessor(root->right, target_node, next);
     
    // if target node found then enter this condition
    if(root->data == target_node->data)
    {
        // this will be true to the last node
        // in inorder traversal i.e., rightmost node.
        if(next == NULL)
            cout << "inorder successor of "
                 << root->data << " is: null\n";
        else
            cout << "inorder successor of "
                 << root->data << " is: "
                 << next->data << "\n";
    }
    next = root;
    inorderSuccessor(root->left, target_node, next);
}
 
// Driver Code
int main()
{
     
    // Let's construct the binary tree
    //          1
    //    /    \
    //   2      3
    //  / \    / \
    // 4   5  6   7
    Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
      root->right->left = newNode(6);
    root->right->right = newNode(7);
     
    // Case 1
    Node* next = NULL;
    inorderSuccessor(root, root, next);
 
    // case 2
    next = NULL;
    inorderSuccessor(root, root->left->left, next);
 
    // case 3
    next = NULL;
    inorderSuccessor(root, root->right->right, next);
     
    return 0;
}
 
// This code is contributed by AASTHA VARMA

Java

// Java program to find inorder successor of a node.
 
class Node {
    int data;
    Node left, right;
 
    Node(int data) {
        this.data = data;
        left = null; right = null;
    }
}
 
// class to find inorder successor of
// a node
class InorderSuccessor {
    Node root;
     
    // to change previous node
    static class PreviousNode {
        Node pNode;
        PreviousNode() {
            pNode = null;
        }
    }
     
    // function to find inorder successor of
    // a node
    private void inOrderSuccessorOfBinaryTree(Node root,
                    PreviousNode pre, int searchNode)
    {
        // Case1: If right child is not NULL
        if(root.right != null)
        inOrderSuccessorOfBinaryTree(root.right, pre, searchNode);
         
        // Case2: If root data is equal to search node
        if(root.data == searchNode)
        System.out.println("inorder successor of " + searchNode + " is: "
                            + (pre.pNode != null ? pre.pNode.data : "null"));
            pre.pNode = root;
             
        if(root.left != null)
        inOrderSuccessorOfBinaryTree(root.left, pre, searchNode);
    }
     
    // Driver program to test above functions
    public static void main(String[] args)
    {
        InorderSuccessor tree = new InorderSuccessor();
         
        // Let's construct the binary tree
        // as shown in above diagram
        tree.root = new Node(1);
        tree.root.left = new Node(2);
        tree.root.right = new Node(3);
 
        tree.root.left.left = new Node(4);
        tree.root.left.right = new Node(5);
        tree.root.right.right = new Node(6);
         
        // Case 1
        tree.inOrderSuccessorOfBinaryTree(tree.root,
                                        new PreviousNode(), 3);
         
        // Case 2
        tree.inOrderSuccessorOfBinaryTree(tree.root,
                                           new PreviousNode(), 4);
         
        // Case 3
        tree.inOrderSuccessorOfBinaryTree(tree.root,
                                          new PreviousNode(), 6);
    }
}
// This code is contributed by Ashish Goyal.

Python3

# Python3 program to find inorder successor.
 
# A Binary Tree Node
# Utility function to create a new tree node
class Node:
 
    # Constructor to create a new node
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
# Function to create a new Node.
def newNode(val):
 
    temp = Node(0)
    temp.data = val
    temp.left = None
    temp.right = None
     
    return temp
 
# function that prints the inorder successor
# of a target node. next will point the last
# tracked node, which will be the answer.
def inorderSuccessor(root, target_node):
     
    global next
     
    # if root is None then return
    if(root == None):
        return
 
    inorderSuccessor(root.right, target_node)
     
    # if target node found, then
    # enter this condition
    if(root.data == target_node.data):
     
        # this will be true to the last node
        # in inorder traversal i.e., rightmost node.
        if(next == None):
            print ("inorder successor of",
                    root.data , " is: None")
        else:
            print ( "inorder successor of",
                     root.data , "is:", next.data)
     
    next = root
    inorderSuccessor(root.left, target_node)
 
# global variable
next = None
 
# Driver Code
if __name__ == '__main__':
     
    # Let's construct the binary tree
    # as shown in above diagram.
    root = newNode(1)
    root.left = newNode(2)
    root.right = newNode(3)
    root.left.left = newNode(4)
    root.left.right = newNode(5)
    root.right.right = newNode(6)
     
    # Case 1
    next = None
    inorderSuccessor(root, root.right)
 
    # case 2
    next = None
    inorderSuccessor(root, root.left.left)
 
    # case 3
    next = None
    inorderSuccessor(root, root.right.right)
     
# This code is contributed by Arnab Kundu

C#

// C# program to find inorder successor of a node.
using System;
 
class Node
{
    public int data;
    public Node left, right;
 
    public Node(int data)
    {
        this.data = data;
        left = null; right = null;
    }
}
 
// class to find inorder successor of
// a node
public class InorderSuccessor
{
    Node root;
     
    // to change previous node
    class PreviousNode
    {
        public Node pNode;
        public PreviousNode()
        {
            pNode = null;
        }
    }
     
    // function to find inorder successor of
    // a node
    private void inOrderSuccessorOfBinaryTree(Node root,
                    PreviousNode pre, int searchNode)
    {
        // Case1: If right child is not NULL
        if(root.right != null)
        inOrderSuccessorOfBinaryTree(root.right,
                                pre, searchNode);
         
        // Case2: If root data is equal to search node
        if(root.data == searchNode)
        {
            Console.Write("inorder successor of " +
                            searchNode + " is: ");
            if(pre.pNode != null)
                Console.WriteLine(pre.pNode.data);
            else
                Console.WriteLine("null");
        }
            pre.pNode = root;
             
        if(root.left != null)
            inOrderSuccessorOfBinaryTree(root.left,
                                pre, searchNode);
    }
     
    // Driver code
    public static void Main(String[] args)
    {
        InorderSuccessor tree = new InorderSuccessor();
         
        // Let's construct the binary tree
        // as shown in above diagram
        tree.root = new Node(1);
        tree.root.left = new Node(2);
        tree.root.right = new Node(3);
 
        tree.root.left.left = new Node(4);
        tree.root.left.right = new Node(5);
        tree.root.right.right = new Node(6);
         
        // Case 1
        tree.inOrderSuccessorOfBinaryTree(tree.root,
                                        new PreviousNode(), 3);
         
        // Case 2
        tree.inOrderSuccessorOfBinaryTree(tree.root,
                                        new PreviousNode(), 4);
         
        // Case 3
        tree.inOrderSuccessorOfBinaryTree(tree.root,
                                        new PreviousNode(), 6);
    }
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
   
// JavaScript program to find inorder successor of a node.
 
class Node
{
    constructor(data)
    {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
 
// class to find inorder successor of
// a node
var root = null;
 
// to change previous node
class PreviousNode
{
    constructor()
    {
        this.pNode = null;
    }
}
 
// function to find inorder successor of
// a node
function inOrderSuccessorOfBinaryTree(root, pre, searchNode)
{
    // Case1: If right child is not NULL
    if(root.right != null)
    inOrderSuccessorOfBinaryTree(root.right,
                            pre, searchNode);
     
    // Case2: If root data is equal to search node
    if(root.data == searchNode)
    {
        document.write("inorder successor of " +
                        searchNode + " is: ");
        if(pre.pNode != null)
            document.write(pre.pNode.data+"<br>");
        else
            document.write("null<br>");
    }
        pre.pNode = root;
         
    if(root.left != null)
        inOrderSuccessorOfBinaryTree(root.left,
                            pre, searchNode);
}
 
// Driver code
 
// Let's construct the binary tree
// as shown in above diagram
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.right = new Node(6);
 
// Case 1
inOrderSuccessorOfBinaryTree(root,
                    new PreviousNode(), 3);
 
// Case 2
inOrderSuccessorOfBinaryTree(root,
                    new PreviousNode(), 4);
 
// Case 3
inOrderSuccessorOfBinaryTree(root,
                    new PreviousNode(), 6);
 
 
</script>

Producción:  

inorder successor of 1 is: 6
inorder successor of 4 is: 2
inorder successor of 7 is: null

Complejidad de tiempo : O( n ), donde n es el número de Nodes en el árbol. 

Complejidad del espacio : O (n) para la pila de llamadas  

Este artículo es una contribución de Harsh Agarwal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *