diff --git a/data_structures/create_tree_from_traversals.cpp b/data_structures/create_tree_from_traversals.cpp new file mode 100644 index 0000000000..aba9d4a041 --- /dev/null +++ b/data_structures/create_tree_from_traversals.cpp @@ -0,0 +1,98 @@ +#include +using namespace std; +#include +#include +#include + +class node { + public: + int data; + node* left; + node* right; + node* parent; + node(int n) { + data = n; + left = NULL; + right = NULL; + parent = NULL; + } +}; +//normal inorder traversal +void inorder(node* head, vector& out) { + node* cur = head; + if (!cur) + return; + inorder(cur->left, out); + out.push_back(cur->data); + inorder(cur->right, out); +} + +//when preorder and inorder vectors are given +node* buildtree2pre(vector& preorder, int preStart, int preEnd, + vector& inorder, int inStart, int inEnd, + map& inmp) { + if (preStart > preEnd || inStart > inEnd) + return NULL; + node* root = new node(preorder[preStart]); + int inroot = inmp[root->data]; + int numsleft = inroot - inStart; + root->left = buildtree2pre(preorder, preStart + 1, preStart + numsleft, + inorder, inStart, inroot - 1, inmp); + root->right = buildtree2pre(preorder, preStart + numsleft + 1, preEnd, + inorder, inroot + 1, inEnd, inmp); + return root; +} +node* buildtreepre(vector& inorder, vector& preorder) { + map inmp; + for (int i = 0; i < inorder.size(); i++) { + inmp[inorder[i]] = i; + } + node* root = buildtree2pre(preorder, 0, preorder.size() - 1, inorder, 0, + inorder.size() - 1, inmp); + return root; +} + +//when postorder and inorder vectors are given +node* buildtree2post(vector& postorder, int postStart, int postEnd, + vector& inorder, int inStart, int inEnd, + map& inmp) { + if (postStart > postEnd || inStart > inEnd) + return NULL; + node* root = new node(postorder[postEnd]); + int inroot = inmp[root->data]; + int numsleft = inroot - inStart; + root->left = buildtree2post(postorder, postStart, postStart + numsleft - 1, + inorder, inStart, inroot - 1, inmp); + root->right = buildtree2post(postorder, postStart + numsleft, postEnd - 1, + inorder, inroot + 1, inEnd, inmp); + return root; +} +node* buildtreepost(vector& inorder, vector& postorder) { + map inmp; + for (int i = 0; i < inorder.size(); i++) { + inmp[inorder[i]] = i; + } + node* root = buildtree2post(postorder, 0, postorder.size() - 1, inorder, 0, + inorder.size() - 1, inmp); + return root; +} + +int main(){ + vector inorder_seq = {1, 2, 3, 4, 5}; + vector preorder_seq = {3, 2, 1, 4, 5}; + vector postorder_seq = {1, 2, 5, 4, 3}; + + cout << "=== Build BST from Preorder & Inorder ===\n"; + node* tree_pre = buildtreepre(inorder_seq, preorder_seq); + vector out; + inorder(tree_pre, out); + cout << "Inorder: "; + for (auto x : out) cout << x << " "; + out.clear(); + cout << endl; + cout << "=== Build BST from Postorder & Inorder ===\n"; + node* tree_post = buildtreepost(inorder_seq, postorder_seq); + inorder(tree_post, out); + cout << "Inorder: "; + for (auto x : out) cout << x << " "; +} \ No newline at end of file