From 5f717a167eca4cdd8759847d0e279ba0cb062fe4 Mon Sep 17 00:00:00 2001 From: YashGosaliya <58128160+YashGosaliya@users.noreply.github.com> Date: Sun, 10 Oct 2021 20:28:22 +0530 Subject: [PATCH 1/3] Create ConstructBinaryTreefromPreorderandInorderTraversal.cpp --- ...aryTreefromPreorderandInorderTraversal.cpp | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 C++/DataStructure/Tree/ConstructBinaryTreefromPreorderandInorderTraversal.cpp diff --git a/C++/DataStructure/Tree/ConstructBinaryTreefromPreorderandInorderTraversal.cpp b/C++/DataStructure/Tree/ConstructBinaryTreefromPreorderandInorderTraversal.cpp new file mode 100644 index 0000000..0b4f67b --- /dev/null +++ b/C++/DataStructure/Tree/ConstructBinaryTreefromPreorderandInorderTraversal.cpp @@ -0,0 +1,31 @@ + +//Problem link: +//https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ + +class Solution { +public: + int preIndex=0; + TreeNode* buildTree(vector& preorder, vector& inorder) { + return createTree(preorder, inorder, 0, inorder.size()-1); + } + + TreeNode* createTree(vector &preorder, vector &inorder, int start, int end) + { + if(start > end) + return NULL; + TreeNode* node = new TreeNode(preorder[preIndex++]); + int pos; + for(int i=start; i<=end;i++) + { + if(inorder[i]==node->val) + { + + pos=i; + break; + } + } + node->left = createTree(preorder, inorder, start, pos-1); + node->right = createTree(preorder, inorder, pos+1, end); + return node; + } +}; From 4358763bc3108ba57997622c18d37dfd583d9b66 Mon Sep 17 00:00:00 2001 From: YashGosaliya <58128160+YashGosaliya@users.noreply.github.com> Date: Sun, 10 Oct 2021 22:07:09 +0530 Subject: [PATCH 2/3] Update and rename ConstructBinaryTreefromPreorderandInorderTraversal.cpp to constructBinaryTreefromPreorderandInorderTraversal.cpp --- ...inaryTreefromPreorderandInorderTraversal.cpp} | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) rename C++/DataStructure/Tree/{ConstructBinaryTreefromPreorderandInorderTraversal.cpp => constructBinaryTreefromPreorderandInorderTraversal.cpp} (68%) diff --git a/C++/DataStructure/Tree/ConstructBinaryTreefromPreorderandInorderTraversal.cpp b/C++/DataStructure/Tree/constructBinaryTreefromPreorderandInorderTraversal.cpp similarity index 68% rename from C++/DataStructure/Tree/ConstructBinaryTreefromPreorderandInorderTraversal.cpp rename to C++/DataStructure/Tree/constructBinaryTreefromPreorderandInorderTraversal.cpp index 0b4f67b..e5679ca 100644 --- a/C++/DataStructure/Tree/ConstructBinaryTreefromPreorderandInorderTraversal.cpp +++ b/C++/DataStructure/Tree/constructBinaryTreefromPreorderandInorderTraversal.cpp @@ -1,7 +1,21 @@ - //Problem link: //https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ +//Time Complexity : O(N) +//Space Complexity : O(N) + + +//Definition for a binary tree node. + +struct TreeNode { + int val; + TreeNode *left; + TreeNode *right; + TreeNode() : val(0), left(nullptr), right(nullptr) {} + TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} + TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} + }; + class Solution { public: int preIndex=0; From 3731e300dc916a21c5bb841a6ad379c66ddb35c7 Mon Sep 17 00:00:00 2001 From: YashGosaliya <58128160+YashGosaliya@users.noreply.github.com> Date: Mon, 11 Oct 2021 10:31:55 +0530 Subject: [PATCH 3/3] Update constructBinaryTreefromPreorderandInorderTraversal.cpp --- ...aryTreefromPreorderandInorderTraversal.cpp | 147 +++++++++++++----- 1 file changed, 104 insertions(+), 43 deletions(-) diff --git a/C++/DataStructure/Tree/constructBinaryTreefromPreorderandInorderTraversal.cpp b/C++/DataStructure/Tree/constructBinaryTreefromPreorderandInorderTraversal.cpp index e5679ca..a07ad53 100644 --- a/C++/DataStructure/Tree/constructBinaryTreefromPreorderandInorderTraversal.cpp +++ b/C++/DataStructure/Tree/constructBinaryTreefromPreorderandInorderTraversal.cpp @@ -1,45 +1,106 @@ -//Problem link: -//https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ - -//Time Complexity : O(N) -//Space Complexity : O(N) - - -//Definition for a binary tree node. - -struct TreeNode { - int val; - TreeNode *left; - TreeNode *right; - TreeNode() : val(0), left(nullptr), right(nullptr) {} - TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} - TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} - }; - -class Solution { -public: - int preIndex=0; - TreeNode* buildTree(vector& preorder, vector& inorder) { - return createTree(preorder, inorder, 0, inorder.size()-1); + /* + Author : Yash Gosaliya + Date : 11/10/2021 + Description : C++ program to construct tree using inorder and preorder traversals + */ + + //Link : https://www.geeksforgeeks.org/construct-tree-from-given-inorder-and-preorder-traversal/ + + //Time Complexity : O(N) + //Space Complexity : O(N) + + #include + + using namespace std; + + /* A binary tree node has data, pointer to left child + and a pointer to right child */ + 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); } - - TreeNode* createTree(vector &preorder, vector &inorder, int start, int end) - { - if(start > end) - return NULL; - TreeNode* node = new TreeNode(preorder[preIndex++]); - int pos; - for(int i=start; i<=end;i++) - { - if(inorder[i]==node->val) - { - - pos=i; - break; - } - } - node->left = createTree(preorder, inorder, start, pos-1); - node->right = createTree(preorder, inorder, pos+1, end); - 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; + + /* Pick current node from Preorder traversal using preIndex and increment preIndex */ + char curr = pre[preIndex++]; + struct Node * tNode = newNode(curr); + + /* If this node has no children then return */ + if (inStrt == inEnd) + return tNode; + + /* Else find the index of this node in Inorder traversal */ + int inIndex = mp[curr]; + + /* Using index in Inorder traversal, construct left and right subtress */ + tNode -> left = buildTree( in , pre, inStrt, inIndex - 1, mp); + tNode -> right = buildTree( in , pre, inIndex + 1, inEnd, mp); + + return tNode; + } + + // This function mainly creates an unordered_map, then + // calls buildTree() + struct Node * buldTreeWrap(char in [], char pre[], int len) { + // Store indexes of all items so that we + // we can quickly find later + unordered_map < char, int > mp; + for (int i = 0; i < len; i++) + mp[ in [i]] = i; + + return buildTree( in , pre, 0, len - 1, mp); + } + + /* This function is here just to test buildTree() */ + void printInorder(struct Node * node) { + if (node == NULL) + return; + printInorder(node -> left); + printf("%c ", node -> data); + printInorder(node -> right); } -}; + + /* Driver program to test above functions */ + 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); + + /* Let us test the built tree by printing + Inorder traversal */ + printf("Inorder traversal of the constructed tree is \n"); + printInorder(root); + } + + /* Inorder traversal of the constructed tree is + D B E A F C */