Ancestro común más bajo en un árbol de búsqueda binario.

 

Dados los valores de dos valores n1 y n2 en un árbol de búsqueda binaria, encuentre el antepasado común más bajo (LCA). Puede suponer que ambos valores existen en el árbol. 

Ejemplos: 

C++

// A recursive CPP program to find
// LCA of two nodes n1 and n2.
#include <bits/stdc++.h>
using namespace std;
 
class node
{
    public:
    int data;
    node* left, *right;
};
 
/* Function to find LCA of n1 and n2.
The function assumes that both
n1 and n2 are present in BST */
node *lca(node* root, int n1, int n2)
{
    if (root == NULL) return NULL;
 
    // If both n1 and n2 are smaller
    // than root, then LCA lies in left
    if (root->data > n1 && root->data > n2)
        return lca(root->left, n1, n2);
 
    // If both n1 and n2 are greater than
    // root, then LCA lies in right
    if (root->data < n1 && root->data < n2)
        return lca(root->right, n1, n2);
 
    return root;
}
 
/* Helper function that allocates
a new node with the given data.*/
node* newNode(int data)
{
    node* Node = new node();
    Node->data = data;
    Node->left = Node->right = NULL;
    return(Node);
}
 
/* Driver code*/
int main()
{
    // Let us construct the BST
    // shown in the above figure
    node *root = newNode(20);
    root->left = newNode(8);
    root->right = newNode(22);
    root->left->left = newNode(4);
    root->left->right = newNode(12);
    root->left->right->left = newNode(10);
    root->left->right->right = newNode(14);
 
    int n1 = 10, n2 = 14;
    node *t = lca(root, n1, n2);
    cout << "LCA of " << n1 << " and " << n2 << " is " << t->data<<endl;
 
    n1 = 14, n2 = 8;
    t = lca(root, n1, n2);
    cout<<"LCA of " << n1 << " and " << n2 << " is " << t->data << endl;
 
    n1 = 10, n2 = 22;
    t = lca(root, n1, n2);
    cout << "LCA of " << n1 << " and " << n2 << " is " << t->data << endl;
    return 0;
}
 
// This code is contributed by rathbhupendra

C

// A recursive C program to find LCA of two nodes n1 and n2.
#include <stdio.h>
#include <stdlib.h>
 
struct node
{
    int data;
    struct node* left, *right;
};
 
/* Function to find LCA of n1 and n2. The function assumes that both
   n1 and n2 are present in BST */
struct node *lca(struct node* root, int n1, int n2)
{
    if (root == NULL) return NULL;
 
    // If both n1 and n2 are smaller than root, then LCA lies in left
    if (root->data > n1 && root->data > n2)
        return lca(root->left, n1, n2);
 
    // If both n1 and n2 are greater than root, then LCA lies in right
    if (root->data < n1 && root->data < n2)
        return lca(root->right, n1, n2);
 
    return root;
}
 
/* Helper function that allocates a new node with the given data.*/
struct node* newNode(int data)
{
    struct node* node = (struct node*)malloc(sizeof(struct node));
    node->data  = data;
    node->left  = node->right = NULL;
    return(node);
}
 
/* Driver program to test lca() */
int main()
{
    // Let us construct the BST shown in the above figure
    struct node *root        = newNode(20);
    root->left               = newNode(8);
    root->right              = newNode(22);
    root->left->left         = newNode(4);
    root->left->right        = newNode(12);
    root->left->right->left  = newNode(10);
    root->left->right->right = newNode(14);
 
    int n1 = 10, n2 = 14;
    struct node *t = lca(root, n1, n2);
    printf("LCA of %d and %d is %d \n", n1, n2, t->data);
 
    n1 = 14, n2 = 8;
    t = lca(root, n1, n2);
    printf("LCA of %d and %d is %d \n", n1, n2, t->data);
 
    n1 = 10, n2 = 22;
    t = lca(root, n1, n2);
    printf("LCA of %d and %d is %d \n", n1, n2, t->data);
 
    getchar();
    return 0;
}

Java

// Recursive Java program to print lca of two nodes
  
// A binary tree node
class Node
{
    int data;
    Node left, right;
  
    Node(int item)
    {
        data = item;
        left = right = null;
    }
}
  
class BinaryTree
{
    Node root;
      
    /* Function to find LCA of n1 and n2. The function assumes that both
       n1 and n2 are present in BST */
    Node lca(Node node, int n1, int n2)
    {
        if (node == null)
            return null;
  
        // If both n1 and n2 are smaller than root, then LCA lies in left
        if (node.data > n1 && node.data > n2)
            return lca(node.left, n1, n2);
  
        // If both n1 and n2 are greater than root, then LCA lies in right
        if (node.data < n1 && node.data < n2)
            return lca(node.right, n1, n2);
  
        return node;
    }
  
    /* Driver program to test lca() */
    public static void main(String args[])
    {
        // Let us construct the BST shown in the above figure
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(20);
        tree.root.left = new Node(8);
        tree.root.right = new Node(22);
        tree.root.left.left = new Node(4);
        tree.root.left.right = new Node(12);
        tree.root.left.right.left = new Node(10);
        tree.root.left.right.right = new Node(14);
  
        int n1 = 10, n2 = 14;
        Node t = tree.lca(tree.root, n1, n2);
        System.out.println("LCA of " + n1 + " and " + n2 + " is " + t.data);
  
        n1 = 14;
        n2 = 8;
        t = tree.lca(tree.root, n1, n2);
        System.out.println("LCA of " + n1 + " and " + n2 + " is " + t.data);
  
        n1 = 10;
        n2 = 22;
        t = tree.lca(tree.root, n1, n2);
        System.out.println("LCA of " + n1 + " and " + n2 + " is " + t.data);
  
    }
}
  
// This code has been contributed by Mayank Jaiswal

Python3

# A recursive python program to find LCA of two nodes
# n1 and n2
 
# A Binary 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 find LCA of n1 and n2. The function assumes
# that both n1 and n2 are present in BST
def lca(root, n1, n2):
     
    # Base Case
    if root is None:
        return None
 
    # If both n1 and n2 are smaller than root, then LCA
    # lies in left
    if(root.data > n1 and root.data > n2):
        return lca(root.left, n1, n2)
 
    # If both n1 and n2 are greater than root, then LCA
    # lies in right
    if(root.data < n1 and root.data < n2):
        return lca(root.right, n1, n2)
 
    return root
 
# Driver program to test above function
 
# Let us construct the BST shown in the figure
root = Node(20)
root.left = Node(8)
root.right = Node(22)
root.left.left = Node(4)
root.left.right = Node(12)
root.left.right.left = Node(10)
root.left.right.right = Node(14)
 
n1 = 10 ; n2 = 14
t = lca(root, n1, n2)
print ("LCA of %d and %d is %d" %(n1, n2, t.data))
 
n1 = 14 ; n2 = 8
t = lca(root, n1, n2)
print ("LCA of %d and %d is %d" %(n1, n2 , t.data))
 
n1 = 10 ; n2 = 22
t = lca(root, n1, n2)
print ("LCA of %d and %d is %d" %(n1, n2, t.data))
 
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)

C#

using System;
 
// Recursive C#  program to print lca of two nodes
 
// A binary tree node
public class Node
{
    public int data;
    public Node left, right;
 
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
public class BinaryTree
{
    public Node root;
 
    /* Function to find LCA of n1 and n2. The function assumes that both
       n1 and n2 are present in BST */
    public virtual Node lca(Node node, int n1, int n2)
    {
        if (node == null)
        {
            return null;
        }
 
        // If both n1 and n2 are smaller than root, then LCA lies in left
        if (node.data > n1 && node.data > n2)
        {
            return lca(node.left, n1, n2);
        }
 
        // If both n1 and n2 are greater than root, then LCA lies in right
        if (node.data < n1 && node.data < n2)
        {
            return lca(node.right, n1, n2);
        }
 
        return node;
    }
 
    /* Driver program to test lca() */
    public static void Main(string[] args)
    {
        // Let us construct the BST shown in the above figure
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(20);
        tree.root.left = new Node(8);
        tree.root.right = new Node(22);
        tree.root.left.left = new Node(4);
        tree.root.left.right = new Node(12);
        tree.root.left.right.left = new Node(10);
        tree.root.left.right.right = new Node(14);
 
        int n1 = 10, n2 = 14;
        Node t = tree.lca(tree.root, n1, n2);
        Console.WriteLine("LCA of " + n1 + " and " + n2 + " is " + t.data);
 
        n1 = 14;
        n2 = 8;
        t = tree.lca(tree.root, n1, n2);
        Console.WriteLine("LCA of " + n1 + " and " + n2 + " is " + t.data);
 
        n1 = 10;
        n2 = 22;
        t = tree.lca(tree.root, n1, n2);
        Console.WriteLine("LCA of " + n1 + " and " + n2 + " is " + t.data);
 
    }
}
 
  //  This code is contributed by Shrikant13

Javascript

<script>
 
// Recursive JavaScript program to print lca of two nodes
    
// A binary tree node
class Node
{
    constructor(item)
    {
        this.data=item;
        this.left=this.right=null;
    }
}
 
let root;
 
function lca(node,n1,n2)
{
    if (node == null)
            return null;
    
        // If both n1 and n2 are smaller than root,
        // then LCA lies in left
        if (node.data > n1 && node.data > n2)
            return lca(node.left, n1, n2);
    
        // If both n1 and n2 are greater than root,
        // then LCA lies in right
        if (node.data < n1 && node.data < n2)
            return lca(node.right, n1, n2);
    
        return node;
}
 
/* Driver program to test lca() */
 // Let us construct the BST shown in the above figure
root = new Node(20);
root.left = new Node(8);
root.right = new Node(22);
root.left.left = new Node(4);
root.left.right = new Node(12);
root.left.right.left = new Node(10);
root.left.right.right = new Node(14);
 
let n1 = 10, n2 = 14;
let t = lca(root, n1, n2);
document.write("LCA of " + n1 + " and " + n2 + " is " +
t.data+"<br>");
 
n1 = 14;
n2 = 8;
t = lca(root, n1, n2);
document.write("LCA of " + n1 + " and " + n2 + " is " +
t.data+"<br>");
 
n1 = 10;
n2 = 22;
t = lca(root, n1, n2);
document.write("LCA of " + n1 + " and " + n2 + " is " +
t.data+"<br>");
 
// This code is contributed by avanitrachhadiya2155
 
</script>

C++

// A recursive CPP program to find
// LCA of two nodes n1 and n2.
#include <bits/stdc++.h>
using namespace std;
 
class node
{
    public:
    int data;
    node* left, *right;
};
 
/* Function to find LCA of n1 and n2.
The function assumes that both n1 and n2
are present in BST */
node *lca(node* root, int n1, int n2)
{
    while (root != NULL)
    {
        // If both n1 and n2 are smaller than root,
        // then LCA lies in left
        if (root->data > n1 && root->data > n2)
        root = root->left;
 
        // If both n1 and n2 are greater than root,
        // then LCA lies in right
        else if (root->data < n1 && root->data < n2)
        root = root->right;
 
        else break;
    }
    return root;
}
  
 
/* Helper function that allocates
a new node with the given data.*/
node* newNode(int data)
{
    node* Node = new node();
    Node->data = data;
    Node->left = Node->right = NULL;
    return(Node);
}
 
/* Driver code*/
int main()
{
    // Let us construct the BST
    // shown in the above figure
    node *root = newNode(20);
    root->left = newNode(8);
    root->right = newNode(22);
    root->left->left = newNode(4);
    root->left->right = newNode(12);
    root->left->right->left = newNode(10);
    root->left->right->right = newNode(14);
 
    int n1 = 10, n2 = 14;
    node *t = lca(root, n1, n2);
    cout << "LCA of " << n1 << " and " << n2 << " is " << t->data<<endl;
 
    n1 = 14, n2 = 8;
    t = lca(root, n1, n2);
    cout<<"LCA of " << n1 << " and " << n2 << " is " << t->data << endl;
 
    n1 = 10, n2 = 22;
    t = lca(root, n1, n2);
    cout << "LCA of " << n1 << " and " << n2 << " is " << t->data << endl;
    return 0;
}
 
// This code is contributed by rathbhupendra

C

// A recursive C program to find LCA of two nodes n1 and n2.
#include <stdio.h>
#include <stdlib.h>
 
struct node
{
    int data;
    struct node* left, *right;
};
 
/* Function to find LCA of n1 and n2. The function assumes that both
n1 and n2 are present in BST */
struct node *lca(struct node* root, int n1, int n2)
{
    while (root != NULL)
    {
        // If both n1 and n2 are smaller than root, then LCA lies in left
        if (root->data > n1 && root->data > n2)
        root = root->left;
 
        // If both n1 and n2 are greater than root, then LCA lies in right
        else if (root->data < n1 && root->data < n2)
        root = root->right;
 
        else break;
    }
    return root;
}
 
 
/* Helper function that allocates a new node with the given data.*/
struct node* newNode(int data)
{
    struct node* node = (struct node*)malloc(sizeof(struct node));
    node->data = data;
    node->left = node->right = NULL;
    return(node);
}
 
/* Driver program to test lca() */
int main()
{
    // Let us construct the BST shown in the above figure
    struct node *root     = newNode(20);
    root->left             = newNode(8);
    root->right             = newNode(22);
    root->left->left         = newNode(4);
    root->left->right     = newNode(12);
    root->left->right->left = newNode(10);
    root->left->right->right = newNode(14);
 
    int n1 = 10, n2 = 14;
    struct node *t = lca(root, n1, n2);
    printf("LCA of %d and %d is %d \n", n1, n2, t->data);
 
    n1 = 14, n2 = 8;
    t = lca(root, n1, n2);
    printf("LCA of %d and %d is %d \n", n1, n2, t->data);
 
    n1 = 10, n2 = 22;
    t = lca(root, n1, n2);
    printf("LCA of %d and %d is %d \n", n1, n2, t->data);
 
    getchar();
    return 0;
}

Java

// Recursive Java program to print lca of two nodes
 
// A binary tree node
class Node
{
    int data;
    Node left, right;
 
    Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
class BinaryTree
{
    Node root;
     
/* Function to find LCA of n1 and n2.
The function assumes that both
n1 and n2 are present in BST */
static Node lca(Node root, int n1, int n2)
{
    while (root != null)
    {
        // If both n1 and n2 are smaller
        // than root, then LCA lies in left
        if (root.data > n1 &&
            root.data > n2)
        root = root.left;
 
        // If both n1 and n2 are greater
        // than root, then LCA lies in right
        else if (root.data < n1 &&
                 root.data < n2)
        root = root.right;
 
        else break;
    }
    return root;
}
 
 
    /* Driver program to test lca() */
    public static void main(String args[])
    {
        // Let us construct the BST shown in the above figure
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(20);
        tree.root.left = new Node(8);
        tree.root.right = new Node(22);
        tree.root.left.left = new Node(4);
        tree.root.left.right = new Node(12);
        tree.root.left.right.left = new Node(10);
        tree.root.left.right.right = new Node(14);
 
        int n1 = 10, n2 = 14;
        Node t = tree.lca(tree.root, n1, n2);
        System.out.println("LCA of " + n1 + " and " + n2 + " is " + t.data);
 
        n1 = 14;
        n2 = 8;
        t = tree.lca(tree.root, n1, n2);
        System.out.println("LCA of " + n1 + " and " + n2 + " is " + t.data);
 
        n1 = 10;
        n2 = 22;
        t = tree.lca(tree.root, n1, n2);
        System.out.println("LCA of " + n1 + " and " + n2 + " is " + t.data);
 
    }
}
// This code is contributed by SHUBHAMSINGH10

Python3

# A recursive python program to find LCA of two nodes
# n1 and n2
 
# A Binary 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 find LCA of n1 and n2.
# The function assumes that both
#   n1 and n2 are present in BST
def lca(root, n1, n2):
    while root:
        # If both n1 and n2 are smaller than root,
        # then LCA lies in left
        if root.data > n1 and root.data > n2:
            root = root.left
         
        # If both n1 and n2 are greater than root,
        # then LCA lies in right
        elif root.data < n1 and root.data < n2:
            root = root.right
 
        else:
            break
 
    return root
 
# Driver program to test above function
# Let us construct the BST shown in the figure
root = Node(20)
root.left = Node(8)
root.right = Node(22)
root.left.left = Node(4)
root.left.right = Node(12)
root.left.right.left = Node(10)
root.left.right.right = Node(14)
 
n1 = 10 ; n2 = 14
t = lca(root, n1, n2)
print ("LCA of %d and %d is %d" %(n1, n2, t.data))
 
n1 = 14 ; n2 = 8
t = lca(root, n1, n2)
print ("LCA of %d and %d is %d" %(n1, n2 , t.data))
 
n1 = 10 ; n2 = 22
t = lca(root, n1, n2)
print ("LCA of %d and %d is %d" %(n1, n2, t.data))
# This Code is Contributed by Sumit Bhardwaj (Timus)

C#

using System;
 
// Recursive C# program to print lca of two nodes
 
// A binary tree node
public class Node
{
    public int data;
    public Node left, right;
 
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
public class BinaryTree
{
    public Node root;
 
/* Function to find LCA of n1 and n2.
The function assumes that both
n1 and n2 are present in BST */
public virtual Node lca(Node root, int n1, int n2)
{
    while (root != null)
    {
        // If both n1 and n2 are smaller than
        // root, then LCA lies in left
        if (root.data > n1 && root.data > n2)
        root = root.left;
  
        // If both n1 and n2 are greater than
        // root, then LCA lies in right
        else if (root.data < n1 && root.data < n2)
        root = root.right;
  
        else break;
    }
    return root;
}
 
    /* Driver program to test lca() */
    public static void Main(string[] args)
    {
        // Let us construct the BST shown in the above figure
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(20);
        tree.root.left = new Node(8);
        tree.root.right = new Node(22);
        tree.root.left.left = new Node(4);
        tree.root.left.right = new Node(12);
        tree.root.left.right.left = new Node(10);
        tree.root.left.right.right = new Node(14);
 
        int n1 = 10, n2 = 14;
        Node t = tree.lca(tree.root, n1, n2);
        Console.WriteLine(
            "LCA of " + n1 + " and " + n2
            + " is " + t.data);
 
        n1 = 14;
        n2 = 8;
        t = tree.lca(tree.root, n1, n2);
        Console.WriteLine(
            "LCA of " + n1 + " and " + n2
            + " is " + t.data);
 
        n1 = 10;
        n2 = 22;
        t = tree.lca(tree.root, n1, n2);
        Console.WriteLine(
            "LCA of " + n1 + " and " + n2
            + " is " + t.data);
    }
}
 
// This code is contributed by Shrikant13

Javascript

<script>
 
// Recursive Javascript program to
// print lca of two nodes
 
// A binary tree node
class Node
{
    constructor(item)
    {
        this.data = item;
        this.left = null;
        this.right = null;
    }
}
 
var root = null;
 
/* Function to find LCA of n1 and n2.
The function assumes that both
n1 and n2 are present in BST */
function lca(root, n1, n2)
{
    while (root != null)
    {
         
        // If both n1 and n2 are smaller than
        // root, then LCA lies in left
        if (root.data > n1 && root.data > n2)
            root = root.left;
  
        // If both n1 and n2 are greater than
        // root, then LCA lies in right
        else if (root.data < n1 && root.data < n2)
            root = root.right;
  
        else break;
    }
    return root;
}
 
// Driver code
 
// Let us construct the BST shown
// in the above figure
root = new Node(20);
root.left = new Node(8);
root.right = new Node(22);
root.left.left = new Node(4);
root.left.right = new Node(12);
root.left.right.left = new Node(10);
root.left.right.right = new Node(14);
 
var n1 = 10, n2 = 14;
var t = lca(root, n1, n2);
document.write("LCA of " + n1 + " and " + n2 +
               " is " + t.data + "<br>");
 
n1 = 14;
n2 = 8;
t = lca(root, n1, n2);
document.write("LCA of " + n1 + " and " + n2 +
               " is " + t.data+ "<br>");
 
n1 = 10;
n2 = 22;
t = lca(root, n1, n2);
document.write("LCA of " + n1 + " and " + n2 +
               " is " + t.data+ "<br>");
                
// This code is contributed by rrrtnx
 
</script>

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 *