From 5a22a8677a3f3df4ce95b83ea42f1dcab4034882 Mon Sep 17 00:00:00 2001 From: atul94 Date: Wed, 17 Oct 2018 14:55:10 +0530 Subject: [PATCH] Reduce time complexity to O(n) Also made the program non-recursive --- ...structBinaryTreeFromInorderAndPreorder.cpp | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/Trees/ConstructBinaryTreeFromInorderAndPreorder.cpp b/Trees/ConstructBinaryTreeFromInorderAndPreorder.cpp index 6b52b4e..2b8194a 100644 --- a/Trees/ConstructBinaryTreeFromInorderAndPreorder.cpp +++ b/Trees/ConstructBinaryTreeFromInorderAndPreorder.cpp @@ -25,27 +25,31 @@ Return : * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ -int findIndex(vector &inorder, int i, int j, int val) -{ - for (auto b = i; b<=j; ++b) - if (inorder[b]==val) - return b; -} -TreeNode* makeTree(vector &preorder, vector &inorder, int i, int j, int& p) -{ - if (i>j) - return NULL; - TreeNode* node = new TreeNode(preorder[p++]); - if (i==j) - return node; - int in = findIndex(inorder, i, j, node->val); - node->left = makeTree(preorder, inorder, i, in-1, p); - node->right = makeTree(preorder, inorder, in+1, j, p); - return node; -} TreeNode* Solution::buildTree(vector &preorder, vector &inorder) { - if (preorder.empty() || inorder.empty()) - return NULL; - int p = 0; - return makeTree(preorder, inorder, 0, inorder.size()-1, p); + vector st; + int ptrInOrder = 0; + int ptrPreOrder = 0; + TreeNode * root; + TreeNode * temp; + root = new TreeNode(preorder[ptrPreOrder++]); + st.push_back(root); + while(ptrPreOrder < preorder.size()){ + if(st.back()->val == inorder[ptrInOrder]){ + temp = st.back(); + st.pop_back(); + ptrInOrder++; + if(!st.empty() && st.back()->val == inorder[ptrInOrder]){ + continue; + }else{ + temp->right = new TreeNode(preorder[ptrPreOrder++]); + st.push_back(temp->right); + } + + }else{ + temp = new TreeNode(preorder[ptrPreOrder++]); + st.back()->left = temp; + st.push_back(temp); + } + } + return root; }