Skip to content

Commit 9c01494

Browse files
committed
added creating tree when traversals are given
1 parent b9c118f commit 9c01494

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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

Comments
 (0)