Construya un árbol binario especial a partir de un recorrido en orden dado

Dado el recorrido en orden de un árbol binario especial en el que la clave de cada Node es mayor que las claves en los hijos izquierdo y derecho, construya el árbol binario y devuelva la raíz.

Ejemplos: 

C++

/* C++ program to construct tree
from inorder traversal */
#include <bits/stdc++.h>
using namespace std;
 
/* A binary tree node has data,
pointer to left child and
a pointer to right child */
class node
{
    public:
    int data;
    node* left;
    node* right;
};
 
/* Prototypes of a utility function to get the maximum
value in inorder[start..end] */
int max(int inorder[], int strt, int end);
 
/* A utility function to allocate memory for a node */
node* newNode(int data);
 
/* Recursive function to construct binary of size len from
Inorder traversal inorder[]. Initial values of start and end
should be 0 and len -1. */
node* buildTree (int inorder[], int start, int end)
{
    if (start > end)
        return NULL;
 
    /* Find index of the maximum element from Binary Tree */
    int i = max (inorder, start, end);
 
    /* Pick the maximum value and make it root */
    node *root = newNode(inorder[i]);
 
    /* If this is the only element in inorder[start..end],
    then return it */
    if (start == end)
        return root;
 
    /* Using index in Inorder traversal, construct left and
    right subtress */
    root->left = buildTree (inorder, start, i - 1);
    root->right = buildTree (inorder, i + 1, end);
 
    return root;
}
 
/* UTILITY FUNCTIONS */
/* Function to find index of the maximum value in arr[start...end] */
int max (int arr[], int strt, int end)
{
    int i, max = arr[strt], maxind = strt;
    for(i = strt + 1; i <= end; i++)
    {
        if(arr[i] > max)
        {
            max = arr[i];
            maxind = i;
        }
    }
    return maxind;
}
 
/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
node* newNode (int data)
{
    node* Node = new node();
    Node->data = data;
    Node->left = NULL;
    Node->right = NULL;
 
    return Node;
}
 
/* This function is here just to test buildTree() */
void printInorder (node* node)
{
    if (node == NULL)
        return;
 
    /* first recur on left child */
    printInorder (node->left);
 
    /* then print the data of node */
    cout<<node->data<<" ";
 
    /* now recur on right child */
    printInorder (node->right);
}
 
/* Driver code*/
int main()
{
    /* Assume that inorder traversal of following tree is given
        40
        / \
        10 30
        /     \
        5     28 */
 
    int inorder[] = {5, 10, 40, 30, 28};
    int len = sizeof(inorder)/sizeof(inorder[0]);
    node *root = buildTree(inorder, 0, len - 1);
 
    /* Let us test the built tree by printing Inorder traversal */
    cout << "Inorder traversal of the constructed tree is \n";
    printInorder(root);
    return 0;
}
 
// This is code is contributed by rathbhupendra

C

/* program to construct tree from inorder traversal */
#include<stdio.h>
#include<stdlib.h>
 
/* A binary tree node has data, pointer to left child
   and a pointer to right child */
struct node
{
    int data;
    struct node* left;
    struct node* right;
};
 
/* Prototypes of a utility function to get the maximum
   value in inorder[start..end] */
int max(int inorder[], int strt, int end);
 
/* A utility function to allocate memory for a node */
struct node* newNode(int data);
 
/* Recursive function to construct binary of size len from
   Inorder traversal inorder[]. Initial values of start and end
   should be 0 and len -1.  */
struct node* buildTree (int inorder[], int start, int end)
{
    if (start > end)
        return NULL;
 
    /* Find index of the maximum element from Binary Tree */
    int i = max (inorder, start, end);
 
    /* Pick the maximum value and make it root */
    struct node *root = newNode(inorder[i]);
 
    /* If this is the only element in inorder[start..end],
       then return it */
    if (start == end)
        return root;
 
    /* Using index in Inorder traversal, construct left and
       right subtress */
    root->left  = buildTree (inorder, start, i-1);
    root->right = buildTree (inorder, i+1, end);
 
    return root;
}
 
/* UTILITY FUNCTIONS */
/* Function to find index of the maximum value in arr[start...end] */
int max (int arr[], int strt, int end)
{
    int i, max = arr[strt], maxind = strt;
    for(i = strt+1; i <= end; i++)
    {
        if(arr[i] > max)
        {
            max = arr[i];
            maxind = i;
        }
    }
    return maxind;
}
 
/* Helper function that allocates a new node with the
   given data and NULL left and right pointers. */
struct node* newNode (int data)
{
    struct node* node = (struct node*)malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
 
    return node;
}
 
/* This function is here just to test buildTree() */
void printInorder (struct node* node)
{
    if (node == NULL)
        return;
 
    /* first recur on left child */
    printInorder (node->left);
 
    /* then print the data of node */
    printf("%d ", node->data);
 
    /* now recur on right child */
    printInorder (node->right);
}
 
/* Driver program to test above functions */
int main()
{
   /* Assume that inorder traversal of following tree is given
         40
       /   \
      10     30
     /         \
    5          28 */
 
    int inorder[] = {5, 10, 40, 30, 28};
    int len = sizeof(inorder)/sizeof(inorder[0]);
    struct node *root = buildTree(inorder, 0, len - 1);
 
    /* Let us test the built tree by printing Inorder traversal */
    printf("\n Inorder traversal of the constructed tree is \n");
    printInorder(root);
    return 0;
}

Java

// Java program to construct tree from inorder traversal
  
/* A binary tree node has data, pointer to left child
   and a pointer to right child */
class Node
{
    int data;
    Node left, right;
  
    Node(int item)
    {
        data = item;
        left = right = null;
    }
}
  
class BinaryTree
{
    Node root;
  
    /* Recursive function to construct binary of size len from
       Inorder traversal inorder[]. Initial values of start and end
       should be 0 and len -1.  */
    Node buildTree(int inorder[], int start, int end, Node node)
    {
        if (start > end)
            return null;
  
        /* Find index of the maximum element from Binary Tree */
        int i = max(inorder, start, end);
  
        /* Pick the maximum value and make it root */
        node = new Node(inorder[i]);
  
        /* If this is the only element in inorder[start..end],
         then return it */
        if (start == end)
            return node;
  
        /* Using index in Inorder traversal, construct left and
         right subtress */
        node.left = buildTree(inorder, start, i - 1, node.left);
        node.right = buildTree(inorder, i + 1, end, node.right);
  
        return node;
    }
  
    /* UTILITY FUNCTIONS */
     
    /* Function to find index of the maximum value in arr[start...end] */
    int max(int arr[], int strt, int end)
    {
        int i, max = arr[strt], maxind = strt;
        for (i = strt + 1; i <= end; i++)
        {
            if (arr[i] > max)
            {
                max = arr[i];
                maxind = i;
            }
        }
        return maxind;
    }
  
    /* This function is here just to test buildTree() */
    void printInorder(Node node)
    {
        if (node == null)
            return;
  
        /* first recur on left child */
        printInorder(node.left);
  
        /* then print the data of node */
        System.out.print(node.data + " ");
  
        /* now recur on right child */
        printInorder(node.right);
    }
  
    public static void main(String args[])
    {
        BinaryTree tree = new BinaryTree();
         
        /* Assume that inorder traversal of following tree is given
             40
            /   \
          10     30
         /         \
        5          28 */
        int inorder[] = new int[]{5, 10, 40, 30, 28};
        int len = inorder.length;
        Node mynode = tree.buildTree(inorder, 0, len - 1, tree.root);
  
        /* Let us test the built tree by printing Inorder traversal */
        System.out.println("Inorder traversal of the constructed tree is ");
        tree.printInorder(mynode);
    }
}
  
// This code has been contributed by Mayank Jaiswal

Python3

# Python3 program to construct tree from
# inorder traversal
 
# Helper class that allocates a new node
# with the given data and None left and
# right pointers.
class newNode:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
# Prototypes of a utility function to get
# the maximum value in inorder[start..end]
 
# Recursive function to construct binary of
# size len from Inorder traversal inorder[].
# Initial values of start and end should be
# 0 and len -1.
def buildTree (inorder, start, end):
    if start > end:
        return None
 
    # Find index of the maximum element
    # from Binary Tree
    i = Max (inorder, start, end)
 
    # Pick the maximum value and make it root
    root = newNode(inorder[i])
 
    # If this is the only element in
    # inorder[start..end], then return it
    if start == end:
        return root
 
    # Using index in Inorder traversal,
    # construct left and right subtress
    root.left = buildTree (inorder, start, i - 1)
    root.right = buildTree (inorder, i + 1, end)
 
    return root
 
# UTILITY FUNCTIONS
 
# Function to find index of the maximum
# value in arr[start...end]
def Max(arr, strt, end):
    i, Max = 0, arr[strt]
    maxind = strt
    for i in range(strt + 1, end + 1):
        if arr[i] > Max:
            Max = arr[i]
            maxind = i
    return maxind
 
# This function is here just to test buildTree()
def printInorder (node):
    if node == None:
        return
 
    # first recur on left child
    printInorder (node.left)
 
    # then print the data of node
    print(node.data, end = " ")
 
    # now recur on right child
    printInorder (node.right)
 
# Driver Code
if __name__ == '__main__':
     
    # Assume that inorder traversal of
    # following tree is given
    #     40
    # / \
    # 10     30
    # /         \
    #5         28
 
    inorder = [5, 10, 40, 30, 28]
    Len = len(inorder)
    root = buildTree(inorder, 0, Len - 1)
 
    # Let us test the built tree by
    # printing Inorder traversal
    print("Inorder traversal of the",
              "constructed tree is ")
    printInorder(root)
     
# This code is contributed by PranchalK

C#

// C# program to construct tree
// from inorder traversal
using System;
 
/* A binary tree node has data,
pointer to left child and a pointer
to right child */
public class Node
{
    public int data;
    public Node left, right;
 
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
class GFG
{
public Node root;
 
/* Recursive function to construct binary
of size len from Inorder traversal inorder[].
Initial values of start and end should be 0
and len -1. */
public virtual Node buildTree(int[] inorder, int start,
                              int end, Node node)
{
    if (start > end)
    {
        return null;
    }
 
    /* Find index of the maximum
    element from Binary Tree */
    int i = max(inorder, start, end);
 
    /* Pick the maximum value and
    make it root */
    node = new Node(inorder[i]);
 
    /* If this is the only element in
    inorder[start..end], then return it */
    if (start == end)
    {
        return node;
    }
 
    /* Using index in Inorder traversal,
    construct left and right subtress */
    node.left = buildTree(inorder, start,
                          i - 1, node.left);
    node.right = buildTree(inorder, i + 1,
                           end, node.right);
 
    return node;
}
 
/* UTILITY FUNCTIONS */
 
/* Function to find index of the
maximum value in arr[start...end] */
public virtual int max(int[] arr,
                       int strt, int end)
{
    int i, max = arr[strt], maxind = strt;
    for (i = strt + 1; i <= end; i++)
    {
        if (arr[i] > max)
        {
            max = arr[i];
            maxind = i;
        }
    }
    return maxind;
}
 
/* This function is here just
   to test buildTree() */
public virtual void printInorder(Node node)
{
    if (node == null)
    {
        return;
    }
 
    /* first recur on left child */
    printInorder(node.left);
 
    /* then print the data of node */
    Console.Write(node.data + " ");
 
    /* now recur on right child */
    printInorder(node.right);
}
 
// Driver Code
public static void Main(string[] args)
{
    GFG tree = new GFG();
 
    /* Assume that inorder traversal
       of following tree is given
        40
        / \
    10     30
    /         \
    5         28 */
    int[] inorder = new int[]{5, 10, 40, 30, 28};
    int len = inorder.Length;
    Node mynode = tree.buildTree(inorder, 0,
                                 len - 1, tree.root);
 
    /* Let us test the built tree by
       printing Inorder traversal */
    Console.WriteLine("Inorder traversal of " +
                   "the constructed tree is ");
    tree.printInorder(mynode);
}
}
 
// This code is contributed by Shrikant13

Javascript

<script>
  
// JavaScript program to construct tree
// from inorder traversal
 
/* A binary tree node has data,
pointer to left child and a pointer
to right child */
class Node
{
    constructor(item)
    {
        this.data = item;
        this.left = null;
        this.right = null;
    }
}
 
var root = null;
 
/* Recursive function to construct binary
of size len from Inorder traversal inorder[].
Initial values of start and end should be 0
and len -1. */
function buildTree(inorder, start, end, node)
{
    if (start > end)
    {
        return null;
    }
 
    /* Find index of the maximum
    element from Binary Tree */
    var i = max(inorder, start, end);
 
    /* Pick the maximum value and
    make it root */
    node = new Node(inorder[i]);
 
    /* If this is the only element in
    inorder[start..end], then return it */
    if (start == end)
    {
        return node;
    }
 
    /* Using index in Inorder traversal,
    construct left and right subtress */
    node.left = buildTree(inorder, start,
                          i - 1, node.left);
    node.right = buildTree(inorder, i + 1,
                           end, node.right);
 
    return node;
}
 
/* UTILITY FUNCTIONS */
 
/* Function to find index of the
maximum value in arr[start...end] */
function max(arr, strt, end)
{
    var i, maxi = arr[strt], maxind = strt;
    for (i = strt + 1; i <= end; i++)
    {
        if (arr[i] > maxi)
        {
            maxi = arr[i];
            maxind = i;
        }
    }
    return maxind;
}
 
/* This function is here just
   to test buildTree() */
function printInorder(node)
{
    if (node == null)
    {
        return;
    }
 
    /* first recur on left child */
    printInorder(node.left);
 
    /* then print the data of node */
    document.write(node.data + " ");
 
    /* now recur on right child */
    printInorder(node.right);
}
 
// Driver Code
 
/* Assume that inorder traversal
   of following tree is given
    40
    / \
10     30
/         \
5         28 */
var inorder = [5, 10, 40, 30, 28];
var len = inorder.length;
var mynode = buildTree(inorder, 0, len - 1, root);
/* Let us test the built tree by
   printing Inorder traversal */
document.write("Inorder traversal of " +
               "the constructed tree is <br>");
printInorder(mynode);
 
 
</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 *