Draw First Couple Level of the Search Tree
Let us consider the below traversals:
Inorder sequence: D B E A F C
Preorder sequence: A B D E C F
In a Preorder sequence, the leftmost element is the root of the tree. So we know 'A' is the root for given sequences. By searching 'A' in the Inorder sequence, we can find out all elements on the left side of 'A' is in the left subtree, and elements on right in the right subtree. So we know the below structure now.
A / \ / \ D B E F C
We recursively follow the above steps and get the following tree.
A / \ / \ B C / \ / / \ / D E F
Algorithm: buildTree()
1) Pick an element from Preorder. Increment a Preorder Index Variable (preIndex in below code) to pick the next element in the next recursive call.
2) Create a new tree node tNode with the data as the picked element.
3) Find the picked element's index in Inorder. Let the index be inIndex.
4) Call buildTree for elements before inIndex and make the built tree as a left subtree of tNode.
5) Call buildTree for elements after inIndex and make the built tree as a right subtree of tNode.
6) return tNode.
C++
              #include <bits/stdc++.h>            
              using              namespace              std;            
              class              node            
              {            
                            public              :            
                            char              data;            
                            node* left;            
                            node* right;            
              };            
              int              search(              char              arr[],                            int              strt,                            int              end,                            char              value);            
              node* newNode(              char              data);            
              node* buildTree(              char              in[],                            char              pre[],                            int              inStrt,                            int              inEnd)            
              {            
                            static              int              preIndex = 0;            
                            if              (inStrt > inEnd)            
                            return              NULL;            
                            node* tNode = newNode(pre[preIndex++]);            
                            if              (inStrt == inEnd)            
                            return              tNode;            
                            int              inIndex = search(in, inStrt, inEnd, tNode->data);            
                            tNode->left = buildTree(in, pre, inStrt, inIndex - 1);            
                            tNode->right = buildTree(in, pre, inIndex + 1, inEnd);            
                            return              tNode;            
              }            
              int              search(              char              arr[],                            int              strt,                            int              end,                            char              value)            
              {            
                            int              i;            
                            for              (i = strt; i <= end; i++)            
                            {            
                            if              (arr[i] == value)            
                            return              i;            
                            }            
              }            
              node* newNode(              char              data)            
              {            
                            node* Node =                            new              node();            
                            Node->data = data;            
                            Node->left = NULL;            
                            Node->right = NULL;            
                            return              (Node);            
              }            
              void              printInorder(node* node)            
              {            
                            if              (node == NULL)            
                            return              ;            
                            printInorder(node->left);            
                            cout<<node->data<<              " "              ;            
                            printInorder(node->right);            
              }            
              int              main()            
              {            
                            char              in[] = {                            'D'              ,                            'B'              ,                            'E'              ,                            'A'              ,                            'F'              ,                            'C'              };            
                            char              pre[] = {                            'A'              ,                            'B'              ,                            'D'              ,                            'E'              ,                            'C'              ,                            'F'              };            
                            int              len =                            sizeof              (in) /                            sizeof              (in[0]);            
                            node* root = buildTree(in, pre, 0, len - 1);            
                            cout <<                            "Inorder traversal of the constructed tree is \n"              ;            
                            printInorder(root);            
              }            
C
              #include <stdio.h>            
              #include <stdlib.h>            
              struct              node {            
                            char              data;            
                            struct              node* left;            
                            struct              node* right;            
              };            
              int              search(              char              arr[],                            int              strt,                            int              end,                            char              value);            
              struct              node* newNode(              char              data);            
              struct              node* buildTree(              char              in[],                            char              pre[],                            int              inStrt,                            int              inEnd)            
              {            
                            static              int              preIndex = 0;            
                            if              (inStrt > inEnd)            
                            return              NULL;            
                            struct              node* tNode = newNode(pre[preIndex++]);            
                            if              (inStrt == inEnd)            
                            return              tNode;            
                            int              inIndex = search(in, inStrt, inEnd, tNode->data);            
                            tNode->left = buildTree(in, pre, inStrt, inIndex - 1);            
                            tNode->right = buildTree(in, pre, inIndex + 1, inEnd);            
                            return              tNode;            
              }            
              int              search(              char              arr[],                            int              strt,                            int              end,                            char              value)            
              {            
                            int              i;            
                            for              (i = strt; i <= end; i++) {            
                            if              (arr[i] == value)            
                            return              i;            
                            }            
              }            
              struct              node* newNode(              char              data)            
              {            
                            struct              node* node = (              struct              node*)              malloc              (              sizeof              (              struct              node));            
                            node->data = data;            
                            node->left = NULL;            
                            node->right = NULL;            
                            return              (node);            
              }            
              void              printInorder(              struct              node* node)            
              {            
                            if              (node == NULL)            
                            return              ;            
                            printInorder(node->left);            
                            printf              (              "%c "              , node->data);            
                            printInorder(node->right);            
              }            
              int              main()            
              {            
                            char              in[] = {                            'D'              ,                            'B'              ,                            'E'              ,                            'A'              ,                            'F'              ,                            'C'              };            
                            char              pre[] = {                            'A'              ,                            'B'              ,                            'D'              ,                            'E'              ,                            'C'              ,                            'F'              };            
                            int              len =                            sizeof              (in) /                            sizeof              (in[0]);            
                            struct              node* root = buildTree(in, pre, 0, len - 1);            
                            printf              (              "Inorder traversal of the constructed tree is \n"              );            
                            printInorder(root);            
                            getchar              ();            
              }            
Java
              class              Node {            
                            char              data;            
                            Node left, right;            
                            Node(              char              item)            
                            {            
                            data = item;            
                            left = right =                            null              ;            
                            }            
              }            
              class              BinaryTree {            
                            Node root;            
                            static              int              preIndex =                            0              ;            
                            Node buildTree(              char              in[],                            char              pre[],                            int              inStrt,                            int              inEnd)            
                            {            
                            if              (inStrt > inEnd)            
                            return              null              ;            
                            Node tNode =                            new              Node(pre[preIndex++]);            
                            if              (inStrt == inEnd)            
                            return              tNode;            
                            int              inIndex = search(in, inStrt, inEnd, tNode.data);            
                            tNode.left = buildTree(in, pre, inStrt, inIndex -                            1              );            
                            tNode.right = buildTree(in, pre, inIndex +                            1              , inEnd);            
                            return              tNode;            
                            }            
                            int              search(              char              arr[],                            int              strt,                            int              end,                            char              value)            
                            {            
                            int              i;            
                            for              (i = strt; i <= end; i++) {            
                            if              (arr[i] == value)            
                            return              i;            
                            }            
                            return              i;            
                            }            
                            void              printInorder(Node node)            
                            {            
                            if              (node ==                            null              )            
                            return              ;            
                            printInorder(node.left);            
                            System.out.print(node.data +                            " "              );            
                            printInorder(node.right);            
                            }            
                            public              static              void              main(String args[])            
                            {            
                            BinaryTree tree =                            new              BinaryTree();            
                            char              in[] =                            new              char              [] {                            'D'              ,                            'B'              ,                            'E'              ,                            'A'              ,                            'F'              ,                            'C'              };            
                            char              pre[] =                            new              char              [] {                            'A'              ,                            'B'              ,                            'D'              ,                            'E'              ,                            'C'              ,                            'F'              };            
                            int              len = in.length;            
                            Node root = tree.buildTree(in, pre,                            0              , len -                            1              );            
                            System.out.println(              "Inorder traversal of constructed tree is : "              );            
                            tree.printInorder(root);            
                            }            
              }            
Python3
              class              Node:            
                            def              __init__(              self              , data):            
                            self              .data                            =              data            
                            self              .left                            =              None            
                            self              .right                            =              None            
              def              buildTree(inOrder, preOrder, inStrt, inEnd):            
                            if              (inStrt > inEnd):            
                            return              None            
                            tNode                            =              Node(preOrder[buildTree.preIndex])            
                            buildTree.preIndex                            +              =              1            
                            if              inStrt                            =              =              inEnd :            
                            return              tNode            
                            inIndex                            =              search(inOrder, inStrt, inEnd, tNode.data)            
                            tNode.left                            =              buildTree(inOrder, preOrder, inStrt, inIndex              -              1              )            
                            tNode.right                            =              buildTree(inOrder, preOrder, inIndex                            +              1              , inEnd)            
                            return              tNode            
              def              search(arr, start, end, value):            
                            for              i                            in              range              (start, end                            +              1              ):            
                            if              arr[i]                            =              =              value:            
                            return              i            
              def              printInorder(node):            
                            if              node                            is              None              :            
                            return            
                            printInorder(node.left)            
                            print              (node.data,end              =              ' '              )            
                            printInorder(node.right)            
              inOrder                            =              [              'D'              ,                            'B'              ,                            'E'              ,                            'A'              ,                            'F'              ,                            'C'              ]            
              preOrder                            =              [              'A'              ,                            'B'              ,                            'D'              ,                            'E'              ,                            'C'              ,                            'F'              ]            
              buildTree.preIndex                            =              0            
              root                            =              buildTree(inOrder, preOrder,                            0              ,                            len              (inOrder)              -              1              )            
              print              (              "Inorder traversal of the constructed tree is"              )            
              printInorder(root)            
C#
              using              System;            
              public              class              Node {            
                            public              char              data;            
                            public              Node left, right;            
                            public              Node(              char              item)            
                            {            
                            data = item;            
                            left = right =                            null              ;            
                            }            
              }            
              class              GFG {            
                            public              Node root;            
                            public              static              int              preIndex = 0;            
                            public              virtual              Node buildTree(              char              [] arr,                            char              [] pre,            
                            int              inStrt,                            int              inEnd)            
                            {            
                            if              (inStrt > inEnd) {            
                            return              null              ;            
                            }            
                            Node tNode =                            new              Node(pre[preIndex++]);            
                            if              (inStrt == inEnd) {            
                            return              tNode;            
                            }            
                            int              inIndex = search(arr, inStrt,            
                            inEnd, tNode.data);            
                            tNode.left = buildTree(arr, pre, inStrt, inIndex - 1);            
                            tNode.right = buildTree(arr, pre, inIndex + 1, inEnd);            
                            return              tNode;            
                            }            
                            public              virtual              int              search(              char              [] arr,                            int              strt,            
                            int              end,                            char              value)            
                            {            
                            int              i;            
                            for              (i = strt; i <= end; i++) {            
                            if              (arr[i] == value) {            
                            return              i;            
                            }            
                            }            
                            return              i;            
                            }            
                            public              virtual              void              printInorder(Node node)            
                            {            
                            if              (node ==                            null              ) {            
                            return              ;            
                            }            
                            printInorder(node.left);            
                            Console.Write(node.data +                            " "              );            
                            printInorder(node.right);            
                            }            
                            public              static              void              Main(              string              [] args)            
                            {            
                            GFG tree =                            new              GFG();            
                            char              [] arr =                            new              char              [] {                            'D'              ,                            'B'              ,                            'E'              ,                            'A'              ,                            'F'              ,                            'C'              };            
                            char              [] pre =                            new              char              [] {                            'A'              ,                            'B'              ,                            'D'              ,                            'E'              ,                            'C'              ,                            'F'              };            
                            int              len = arr.Length;            
                            Node root = tree.buildTree(arr, pre, 0, len - 1);            
                            Console.WriteLine(              "Inorder traversal of "            
                            +                            "constructed tree is : "              );            
                            tree.printInorder(root);            
                            }            
              }            
Javascript
              <script>            
              class Node            
              {            
                            constructor(item)            
                            {            
                            this              .data = item;            
                            this              .left =                            this              .right =                            null              ;            
                            }            
              }            
              let root;            
              let preIndex = 0;            
              function              buildTree(In, pre, inStrt, inEnd)            
              {            
                            if              (inStrt > inEnd)            
                            return              null              ;            
                            let tNode =                            new              Node(pre[preIndex++]);            
                            if              (inStrt == inEnd)            
                            return              tNode;            
                            let inIndex = search(In, inStrt,            
                            inEnd, tNode.data);            
                            tNode.left = buildTree(In, pre, inStrt,            
                            inIndex - 1);            
                            tNode.right = buildTree(In, pre,            
                            inIndex + 1,            
                            inEnd);            
                            return              tNode;            
              }            
              function              search(arr, strt, end, value)            
              {            
                            let i;            
                            for              (i = strt; i <= end; i++)            
                            {            
                            if              (arr[i] == value)            
                            return              i;            
                            }            
                            return              i;            
              }            
              function              printInorder(node)            
              {            
                            if              (node ==                            null              )            
                            return              ;            
                            printInorder(node.left);            
                            document.write(node.data +                            " "              );            
                            printInorder(node.right);            
              }            
              let In = [ 'D              ', '              B              ', '              E              ', '              A              ', '              F              ', '              C              ' ];            
              let pre = [ '              A              ', '              B              ', '              D              ', '              E              ', '              C              ', '              F'];            
              let len = In.length;            
              root = buildTree(In, pre, 0, len - 1);            
              document.write(              "Inorder traversal of "              +            
                            "constructed tree is : <br>"              );            
              printInorder(root);            
              </script>            
Output:
Inorder traversal of the constructed tree is D B E A F C
          Time Complexity: O(n^2). The worst case occurs when the tree is left-skewed. Example Preorder and Inorder traversals for worst-case are {A, B, C, D} and {D, C, B, A}.
          Efficient Approach :          
We can optimize the above solution using hashing (unordered_map in C++ or HashMap in Java). We store indexes of inorder traversal in a hash table. So that search can be done O(1) time.
C++
              #include <bits/stdc++.h>            
              using              namespace              std;            
              struct              Node {            
                            char              data;            
                            struct              Node* left;            
                            struct              Node* right;            
              };            
              struct              Node* newNode(              char              data)            
              {            
                            struct              Node* node =                            new              Node;            
                            node->data = data;            
                            node->left = node->right = NULL;            
                            return              (node);            
              }            
              struct              Node* buildTree(              char              in[],                            char              pre[],                            int              inStrt,            
                            int              inEnd, unordered_map<              char              ,                            int              >& mp)            
              {            
                            static              int              preIndex = 0;            
                            if              (inStrt > inEnd)            
                            return              NULL;            
                            char              curr = pre[preIndex++];            
                            struct              Node* tNode = newNode(curr);            
                            if              (inStrt == inEnd)            
                            return              tNode;            
                            int              inIndex = mp[curr];            
                            tNode->left = buildTree(in, pre, inStrt, inIndex - 1, mp);            
                            tNode->right = buildTree(in, pre, inIndex + 1, inEnd, mp);            
                            return              tNode;            
              }            
              struct              Node* buldTreeWrap(              char              in[],                            char              pre[],                            int              len)            
              {            
                            unordered_map<              char              ,                            int              > mp;            
                            for              (              int              i = 0; i < len; i++)            
                            mp[in[i]] = i;            
                            return              buildTree(in, pre, 0, len - 1, mp);            
              }            
              void              printInorder(              struct              Node* node)            
              {            
                            if              (node == NULL)            
                            return              ;            
                            printInorder(node->left);            
                            printf              (              "%c "              , node->data);            
                            printInorder(node->right);            
              }            
              int              main()            
              {            
                            char              in[] = {                            'D'              ,                            'B'              ,                            'E'              ,                            'A'              ,                            'F'              ,                            'C'              };            
                            char              pre[] = {                            'A'              ,                            'B'              ,                            'D'              ,                            'E'              ,                            'C'              ,                            'F'              };            
                            int              len =                            sizeof              (in) /                            sizeof              (in[0]);            
                            struct              Node* root = buldTreeWrap(in, pre, len);            
                            printf              (              "Inorder traversal of the constructed tree is \n"              );            
                            printInorder(root);            
              }            
Java
              import              java.io.*;            
              import              java.util.*;            
              class              Node            
              {            
                            char              data;            
                            Node left,right;            
                            Node(              char              item)            
                            {            
                            data = item;            
                            left = right =                            null              ;            
                            }            
              }            
              class              Tree            
              {            
                            public              static              Node root;            
                            static              HashMap<Character,Integer> mp =                            new              HashMap<>();            
                            static              int              preIndex =                            0              ;            
                            public              static              Node buildTree(              char              [] in,                            char              [] pre,                            int              inStrt,                            int              inEnd)            
                            {            
                            if              (inStrt > inEnd)            
                            {            
                            return              null              ;            
                            }            
                            char              curr = pre[preIndex++];            
                            Node tNode;            
                            tNode =                            new              Node(curr);            
                            if              (inStrt == inEnd)            
                            {            
                            return              tNode;            
                            }            
                            int              inIndex = mp.get(curr);            
                            tNode.left = buildTree(in, pre, inStrt, inIndex -                            1              );            
                            tNode.right = buildTree(in, pre, inIndex +                            1              , inEnd);            
                            return              tNode;            
                            }            
                            public              static              Node buldTreeWrap(              char              [] in,                            char              [] pre,                            int              len)            
                            {            
                            for              (              int              i =                            0              ; i < len; i++)            
                            {            
                            mp.put(in[i], i);            
                            }            
                            return              buildTree(in, pre,                            0              , len -                            1              );            
                            }            
                            static              void              printInorder(Node node)            
                            {            
                            if              (node ==                            null              )            
                            {            
                            return              ;            
                            }            
                            printInorder(node.left);            
                            System.out.print(node.data +                            " "              );            
                            printInorder(node.right);            
                            }            
                            public              static              void              main (String[] args)            
                            {            
                            char              [] in = {              'D'              ,                            'B'              ,                            'E'              ,                            'A'              ,                            'F'              ,                            'C'              };            
                            char              [] pre = {              'A'              ,                            'B'              ,                            'D'              ,                            'E'              ,                            'C'              ,                            'F'              };            
                            int              len = in.length;            
                            Tree.root=buldTreeWrap(in, pre, len);            
                            System.out.println(              "Inorder traversal of the constructed tree is"              );            
                            printInorder(root);            
                            }            
              }            
Python3
              class              Node:            
                            def              __init__(              self              , x):            
                            self              .data                            =              x            
                            self              .left                            =              None            
                            self              .right                            =              None            
              def              buildTree(inn, pre, inStrt, inEnd):            
                            global              preIndex, mp            
                            if              (inStrt > inEnd):            
                            return              None            
                            curr                            =              pre[preIndex]            
                            preIndex                            +              =              1            
                            tNode                            =              Node(curr)            
                            if              (inStrt                            =              =              inEnd):            
                            return              tNode            
                            inIndex                            =              mp[curr]            
                            tNode.left                            =              buildTree(inn, pre, inStrt,            
                            inIndex                            -              1              )            
                            tNode.right                            =              buildTree(inn, pre, inIndex                            +              1              ,            
                            inEnd)            
                            return              tNode            
              def              buldTreeWrap(inn, pre, lenn):            
                            global              mp            
                            for              i                            in              range              (lenn):            
                            mp[inn[i]]                            =              i            
                            return              buildTree(inn, pre,                            0              , lenn                            -              1              )            
              def              printInorder(node):            
                            if              (node                            =              =              None              ):            
                            return            
                            printInorder(node.left)            
                            print              (node.data, end                            =              " "              )            
                            printInorder(node.right)            
              if              __name__                            =              =              '__main__'              :            
                            mp                            =              {}            
                            preIndex                            =              0            
                            inn                            =              [                            'D'              ,                            'B'              ,                            'E'              ,                            'A'              ,                            'F'              ,                            'C'              ]            
                            pre                            =              [                            'A'              ,                            'B'              ,                            'D'              ,                            'E'              ,                            'C'              ,                            'F'              ]            
                            lenn                            =              len              (inn)            
                            root                            =              buldTreeWrap(inn, pre,lenn)            
                            print              (              "Inorder traversal of "            
                            "the constructed tree is"              )            
                            printInorder(root)            
C#
              using              System;            
              using              System.Collections.Generic;            
              public              class              Node            
              {            
                            public              char              data;            
                            public              Node left, right;            
                            public              Node(              char              d)            
                            {            
                            data = d;            
                            left = right =                            null              ;            
                            }            
              }            
              public              class              Tree            
              {            
                            public              static              Node root;            
                            static              Dictionary<              char              ,              int              > mp =                            new              Dictionary<              char              ,              int              >();            
                            static              int              preIndex = 0;            
                            static              Node buildTree(              char              [] In,                            char              [] pre,            
                            int              inStrt,                            int              inEnd)            
                            {            
                            if              (inStrt > inEnd)            
                            {            
                            return              null              ;            
                            }            
                            char              curr = pre[preIndex++];            
                            Node tNode;            
                            tNode =                            new              Node(curr);            
                            if              (inStrt == inEnd)            
                            {            
                            return              tNode;            
                            }            
                            int              inIndex = mp[curr];            
                            tNode.left = buildTree(In, pre, inStrt, inIndex - 1);            
                            tNode.right = buildTree(In, pre, inIndex + 1, inEnd);            
                            return              tNode;            
                            }            
                            public              static              Node buldTreeWrap(              char              [] In,                            char              [] pre,                            int              len)            
                            {            
                            for              (              int              i = 0; i < len; i++)            
                            {            
                            mp.Add(In[i], i);            
                            }            
                            return              buildTree(In, pre, 0, len - 1);            
                            }            
                            static              void              printInorder(Node node)            
                            {            
                            if              (node ==                            null              )            
                            {            
                            return              ;            
                            }            
                            printInorder(node.left);            
                            Console.Write(node.data +                            " "              );            
                            printInorder(node.right);            
                            }            
                            static              public              void              Main (){            
                            char              [] In = {              'D'              ,                            'B'              ,                            'E'              ,                            'A'              ,                            'F'              ,                            'C'              };            
                            char              [] pre = {              'A'              ,                            'B'              ,                            'D'              ,                            'E'              ,                            'C'              ,                            'F'              };            
                            int              len = In.Length;            
                            Tree.root = buldTreeWrap(In, pre, len);            
                            Console.WriteLine(              "Inorder traversal of the constructed tree is"              );            
                            printInorder(Tree.root);            
                            }            
              }            
Output:
Inorder traversal of the constructed tree is D B E A F C
Time Complexity : O(n)
Another approach :            
Use the fact that InOrder traversal is Left-Root-Right and PreOrder traversal is Root-Left-Right. Also, the first node in the PreOrder traversal is always the root node and the first node in the InOrder traversal is the leftmost node in the tree.
Maintain two data structures: Stack (to store the path we visited while traversing PreOrder array) and Set (to maintain the node in which the next right subtree is expected).
1. Do below until you reach the leftmost node.
Keep creating the nodes from the PreOrder traversal
If the stack's topmost element is not in the set, link the created node to the left child of the stack's topmost element (if any), without popping the element.
Else link the created node to the right child of the stack's topmost element. Remove the stack's topmost element from the set and the stack.
Push the node to a stack.
           
        
2. Keep popping the nodes from the stack until either the stack is empty, or the topmost element of the stack compares to the current element of InOrder traversal. Once the loop is over, push the last node back into the stack and into the set.
           
        
3. Goto Step 1.
           
        
C++
              #include<bits/stdc++.h>            
              using              namespace              std;            
              class              TreeNode            
              {            
                            public              :            
                            int              val;            
                            TreeNode* left;            
                            TreeNode* right;            
                            TreeNode(              int              x) { val = x; }            
              };            
              set<TreeNode*> s;            
              stack<TreeNode*> st;            
              TreeNode* buildTree(              int              preorder[],                            int              inorder[],              int              n)            
              {            
                            TreeNode* root = NULL;            
                            for              (              int              pre = 0, in = 0; pre < n;)            
                            {            
                            TreeNode* node = NULL;            
                            do            
                            {            
                            node =                            new              TreeNode(preorder[pre]);            
                            if              (root == NULL)            
                            {            
                            root = node;            
                            }            
                            if              (st.size() > 0)            
                            {            
                            if              (s.find(st.top()) != s.end())            
                            {            
                            s.erase(st.top());            
                            st.top()->right = node;            
                            st.pop();            
                            }            
                            else            
                            {            
                            st.top()->left = node;            
                            }            
                            }            
                            st.push(node);            
                            }                            while              (preorder[pre++] != inorder[in] && pre < n);            
                            node = NULL;            
                            while              (st.size() > 0 && in < n &&            
                            st.top()->val == inorder[in])            
                            {            
                            node = st.top();            
                            st.pop();            
                            in++;            
                            }            
                            if              (node != NULL)            
                            {            
                            s.insert(node);            
                            st.push(node);            
                            }            
                            }            
                            return              root;            
              }            
              void              printInorder(TreeNode* node)            
              {            
                            if              (node == NULL)            
                            return              ;            
                            printInorder(node->left);            
                            cout << node->val <<                            " "              ;            
                            printInorder(node->right);            
              }            
              int              main()            
              {            
                            int              in[] = { 9, 8, 4, 2, 10, 5, 10, 1, 6, 3, 13, 12, 7 };            
                            int              pre[] = { 1, 2, 4, 8, 9, 5, 10, 10, 3, 6, 7, 12, 13 };            
                            int              len =                            sizeof              (in)/              sizeof              (              int              );            
                            TreeNode *root = buildTree(pre, in, len);            
                            printInorder(root);            
                            return              0;            
              }            
Java
              import              java.util.*;            
              public              class              TreeNode {            
                            int              val;            
                            TreeNode left;            
                            TreeNode right;            
                            TreeNode(              int              x) { val = x; }            
              }            
              class              BinaryTree {            
                            static              Set<TreeNode> set =                            new              HashSet<>();            
                            static              Stack<TreeNode> stack =                            new              Stack<>();            
                            public              TreeNode buildTree(              int              [] preorder,                            int              [] inorder)            
                            {            
                            TreeNode root =                            null              ;            
                            for              (              int              pre =                            0              , in =                            0              ; pre < preorder.length;) {            
                            TreeNode node =                            null              ;            
                            do              {            
                            node =                            new              TreeNode(preorder[pre]);            
                            if              (root ==                            null              ) {            
                            root = node;            
                            }            
                            if              (!stack.isEmpty()) {            
                            if              (set.contains(stack.peek())) {            
                            set.remove(stack.peek());            
                            stack.pop().right = node;            
                            }            
                            else              {            
                            stack.peek().left = node;            
                            }            
                            }            
                            stack.push(node);            
                            }                            while              (preorder[pre++] != inorder[in] && pre < preorder.length);            
                            node =                            null              ;            
                            while              (!stack.isEmpty() && in < inorder.length &&            
                            stack.peek().val == inorder[in]) {            
                            node = stack.pop();            
                            in++;            
                            }            
                            if              (node !=                            null              ) {            
                            set.add(node);            
                            stack.push(node);            
                            }            
                            }            
                            return              root;            
                            }            
                            void              printInorder(TreeNode node)            
                            {            
                            if              (node ==                            null              )            
                            return              ;            
                            printInorder(node.left);            
                            System.out.print(node.val +                            " "              );            
                            printInorder(node.right);            
                            }            
                            public              static              void              main(String args[])            
                            {            
                            BinaryTree tree =                            new              BinaryTree();            
                            int              in[] =                            new              int              [] {                            9              ,                            8              ,                            4              ,                            2              ,                            10              ,                            5              ,                            10              ,                            1              ,                            6              ,                            3              ,                            13              ,                            12              ,                            7              };            
                            int              pre[] =                            new              int              [] {                            1              ,                            2              ,                            4              ,                            8              ,                            9              ,                            5              ,                            10              ,                            10              ,                            3              ,                            6              ,                            7              ,                            12              ,                            13              };            
                            int              len = in.length;            
                            TreeNode root = tree.buildTree(pre, in);            
                            tree.printInorder(root);            
                            }            
              }            
Python3
              class              TreeNode:            
                            def              __init__(              self              , x):            
                            self              .val                            =              x            
                            self              .left                            =              None            
                            self              .right                            =              None            
              s                            =              set              ()            
              st                            =              []            
              def              buildTree(preorder, inorder, n):            
                            root                            =              None              ;            
                            pre                            =              0            
                            in_t                            =              0            
                            while              pre < n:            
                            node                            =              None              ;            
                            while              True              :            
                            node                            =              TreeNode(preorder[pre])            
                            if              (root                            =              =              None              ):            
                            root                            =              node;            
                            if              (              len              (st) >                            0              ):            
                            if              (st[              -              1              ]                            in              s):            
                            s.discard(st[              -              1              ]);            
                            st[              -              1              ].right                            =              node;            
                            st.pop();            
                            else              :            
                            st[              -              1              ].left                            =              node;            
                            st.append(node);            
                            if              pre>              =              n                            or              preorder[pre]                            =              =              inorder[in_t]:            
                            pre                            +              =              1            
                            break            
                            pre                            +              =              1            
                            node                            =              None              ;            
                            while              (              len              (st) >                            0              and              in_t < n                            and              st[              -              1              ].val                            =              =              inorder[in_t]):            
                            node                            =              st[              -              1              ];            
                            st.pop();            
                            in_t                            +              =              1            
                            if              (node !              =              None              ):            
                            s.add(node);            
                            st.append(node);            
                            return              root;            
              def              printInorder( node):            
                            if              (node                            =              =              None              ):            
                            return              ;            
                            printInorder(node.left);            
                            print              (node.val, end              =              " "              );            
                            printInorder(node.right);            
              if              __name__              =              =              '__main__'              :            
                            in_t                            =              [                            9              ,                            8              ,                            4              ,                            2              ,                            10              ,                            5              ,                            10              ,                            1              ,                            6              ,                            3              ,                            13              ,                            12              ,                            7              ]            
                            pre                            =              [                            1              ,                            2              ,                            4              ,                            8              ,                            9              ,                            5              ,                            10              ,                            10              ,                            3              ,                            6              ,                            7              ,                            12              ,                            13              ]            
                            l                            =              len              (in_t)            
                            root                            =              buildTree(pre, in_t, l);            
                            printInorder(root);            
C#
              using              System;            
              using              System.Collections.Generic;            
              public              class              TreeNode            
              {            
                            public              int              val;            
                            public              TreeNode left;            
                            public              TreeNode right;            
                            public              TreeNode(              int              x) { val = x; }            
              }            
              class              GFG            
              {            
                            static              HashSet<TreeNode>                            set              =                            new              HashSet<TreeNode>();            
                            static              Stack<TreeNode> stack =                            new              Stack<TreeNode>();            
                            public              TreeNode buildTree(              int              [] preorder,                            int              [] inorder)            
                            {            
                            TreeNode root =                            null              ;            
                            for              (              int              pre = 0, iN = 0; pre < preorder.Length;)            
                            {            
                            TreeNode node =                            null              ;            
                            do              {            
                            node =                            new              TreeNode(preorder[pre]);            
                            if              (root ==                            null              )            
                            {            
                            root = node;            
                            }            
                            if              (stack.Count != 0)            
                            {            
                            if              (              set              .Contains(stack.Peek()))            
                            {            
                            set              .Remove(stack.Peek());            
                            stack.Pop().right = node;            
                            }            
                            else            
                            {            
                            stack.Peek().left = node;            
                            }            
                            }            
                            stack.Push(node);            
                            }                            while              (preorder[pre++] != inorder[iN] &&            
                            pre < preorder.Length);            
                            node =                            null              ;            
                            while              (stack.Count != 0 && iN < inorder.Length &&            
                            stack.Peek().val == inorder[iN])            
                            {            
                            node = stack.Pop();            
                            iN++;            
                            }            
                            if              (node !=                            null              )            
                            {            
                            set              .Add(node);            
                            stack.Push(node);            
                            }            
                            }            
                            return              root;            
                            }            
                            void              printInorder(TreeNode node)            
                            {            
                            if              (node ==                            null              )            
                            return              ;            
                            printInorder(node.left);            
                            Console.Write(node.val +                            " "              );            
                            printInorder(node.right);            
                            }            
                            public              static              void              Main(String []args)            
                            {            
                            GFG tree =                            new              GFG();            
                            int              []iN =                            new              int              [] { 9, 8, 4, 2, 10, 5, 10,            
                            1, 6, 3, 13, 12, 7 };            
                            int              []pre =                            new              int              [] { 1, 2, 4, 8, 9, 5, 10,            
                            10, 3, 6, 7, 12, 13 };            
                            int              len = iN.Length;            
                            TreeNode root = tree.buildTree(pre, iN);            
                            tree.printInorder(root);            
                            }            
              }            
Javascript
              <script>            
                            class TreeNode            
                            {            
                            constructor(x) {            
                            this              .val = x;            
                            this              .left =                            null              ;            
                            this              .right =                            null              ;            
                            }            
                            }            
                            let set =                            new              Set();            
                            let stack = [];            
                            function              buildTree(preorder,inorder)            
                            {            
                            let root =                            null              ;            
                            for              (let pre = 0,In=0; pre < preorder.length;) {            
                            let node =                            null              ;            
                            do              {            
                            node =                            new              TreeNode(preorder[pre]);            
                            if              (root ==                            null              ) {            
                            root = node;            
                            }            
                            if              (stack.length!=0) {            
                            if              (set.has(stack[stack.length-1])) {            
                            set.              delete              (stack[stack.length-1]);            
                            stack.pop().right = node;            
                            }            
                            else              {            
                            stack[stack.length-1].left = node;            
                            }            
                            }            
                            stack.push(node);            
                            }                            while              (preorder[pre++] != inorder[In] && pre < preorder.length);            
                            node =                            null              ;            
                            while              (stack.length!=0 && In < inorder.length &&            
                            stack[stack.length-1].val == inorder[In]) {            
                            node = stack.pop();            
                            In++;            
                            }            
                            if              (node !=                            null              ) {            
                            set.add(node);            
                            stack.push(node);            
                            }            
                            }            
                            return              root;            
                            }            
                            function              printInorder(node)            
                            {            
                            if              (node ==                            null              )            
                            return              ;            
                            printInorder(node.left);            
                            document.write(node.val +                            " "              );            
                            printInorder(node.right);            
                            }            
                            let In=[9, 8, 4, 2, 10, 5, 10, 1, 6, 3, 13, 12, 7 ];            
                            let pre=[1, 2, 4, 8, 9, 5, 10, 10, 3, 6, 7, 12, 13 ];            
                            let len = In.length;            
                            let root=buildTree(pre, In);            
                            printInorder(root);            
              </script>            
Output:
9 8 4 2 10 5 10 1 6 3 13 12 7
Construct a Binary Tree from Postorder and Inorder
Source: https://www.geeksforgeeks.org/construct-tree-from-given-inorder-and-preorder-traversal/
0 Response to "Draw First Couple Level of the Search Tree"
Publicar un comentario