1+ #include < iostream>
2+ using namespace std ;
3+ #include < map>
4+ #include < stack>
5+ #include < vector>
6+
7+ class node {
8+ public:
9+ int data;
10+ node* left;
11+ node* right;
12+ node* parent;
13+ node (int n) {
14+ data = n;
15+ left = NULL ;
16+ right = NULL ;
17+ parent = NULL ;
18+ }
19+ };
20+ // normal inorder traversal
21+ void inorder (node* head, vector<int >& out) {
22+ node* cur = head;
23+ if (!cur)
24+ return ;
25+ inorder (cur->left , out);
26+ out.push_back (cur->data );
27+ inorder (cur->right , out);
28+ }
29+
30+ // when preorder and inorder vectors are given
31+ node* buildtree2pre (vector<int >& preorder, int preStart, int preEnd,
32+ vector<int >& inorder, int inStart, int inEnd,
33+ map<int , int >& inmp) {
34+ if (preStart > preEnd || inStart > inEnd)
35+ return NULL ;
36+ node* root = new node (preorder[preStart]);
37+ int inroot = inmp[root->data ];
38+ int numsleft = inroot - inStart;
39+ root->left = buildtree2pre (preorder, preStart + 1 , preStart + numsleft,
40+ inorder, inStart, inroot - 1 , inmp);
41+ root->right = buildtree2pre (preorder, preStart + numsleft + 1 , preEnd,
42+ inorder, inroot + 1 , inEnd, inmp);
43+ return root;
44+ }
45+ node* buildtreepre (vector<int >& inorder, vector<int >& preorder) {
46+ map<int , int > inmp;
47+ for (int i = 0 ; i < inorder.size (); i++) {
48+ inmp[inorder[i]] = i;
49+ }
50+ node* root = buildtree2pre (preorder, 0 , preorder.size () - 1 , inorder, 0 ,
51+ inorder.size () - 1 , inmp);
52+ return root;
53+ }
54+
55+ // when postorder and inorder vectors are given
56+ node* buildtree2post (vector<int >& postorder, int postStart, int postEnd,
57+ vector<int >& inorder, int inStart, int inEnd,
58+ map<int , int >& inmp) {
59+ if (postStart > postEnd || inStart > inEnd)
60+ return NULL ;
61+ node* root = new node (postorder[postEnd]);
62+ int inroot = inmp[root->data ];
63+ int numsleft = inroot - inStart;
64+ root->left = buildtree2post (postorder, postStart, postStart + numsleft - 1 ,
65+ inorder, inStart, inroot - 1 , inmp);
66+ root->right = buildtree2post (postorder, postStart + numsleft, postEnd - 1 ,
67+ inorder, inroot + 1 , inEnd, inmp);
68+ return root;
69+ }
70+ node* buildtreepost (vector<int >& inorder, vector<int >& postorder) {
71+ map<int , int > inmp;
72+ for (int i = 0 ; i < inorder.size (); i++) {
73+ inmp[inorder[i]] = i;
74+ }
75+ node* root = buildtree2post (postorder, 0 , postorder.size () - 1 , inorder, 0 ,
76+ inorder.size () - 1 , inmp);
77+ return root;
78+ }
79+
80+ int main (){
81+ vector<int > inorder_seq = {1 , 2 , 3 , 4 , 5 };
82+ vector<int > preorder_seq = {3 , 2 , 1 , 4 , 5 };
83+ vector<int > postorder_seq = {1 , 2 , 5 , 4 , 3 };
84+
85+ cout << " === Build BST from Preorder & Inorder ===\n " ;
86+ node* tree_pre = buildtreepre (inorder_seq, preorder_seq);
87+ vector<int > out;
88+ inorder (tree_pre, out);
89+ cout << " Inorder: " ;
90+ for (auto x : out) cout << x << " " ;
91+ out.clear ();
92+ cout << endl;
93+ cout << " === Build BST from Postorder & Inorder ===\n " ;
94+ node* tree_post = buildtreepost (inorder_seq, postorder_seq);
95+ inorder (tree_post, out);
96+ cout << " Inorder: " ;
97+ for (auto x : out) cout << x << " " ;
98+ }
0 commit comments