-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathbinary-search-tree-traversal.cpp
119 lines (99 loc) · 3.07 KB
/
binary-search-tree-traversal.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <bits/stdc++.h>
template< class T >
class BST {
private:
T m_val;
std::unique_ptr<BST> m_lft;
std::unique_ptr<BST> m_rht;
public:
BST(T val) : m_val(val), m_lft(nullptr), m_rht(nullptr) {}
BST& insert(T val) {
if ( val < m_val )
{
if ( !m_lft ) { m_lft = std::unique_ptr<BST>(new BST(val)); }
else { m_lft->insert(val); }
}
else if ( val > m_val )
{
if ( !m_rht ) { m_rht = std::unique_ptr<BST>(new BST(val)); }
else { m_rht->insert(val); }
}
return *this;
}
void insert( const std::vector<T>& val ) { for ( auto it : val ) { insert(it); } }
void inOrder(BST* cur, std::vector<T>& m) {
if ( cur )
{
inOrder (cur->m_lft.get(), m);
m.push_back(cur->m_val );
inOrder (cur->m_rht.get(), m);
}
}
void preOrder(BST* cur, std::vector<T>& m) {
if ( cur )
{
m.push_back(cur->m_val);
preOrder( cur->m_lft.get(), m);
preOrder( cur->m_rht.get(), m);
}
}
void postOrder(BST* cur, std::vector<T>& m) {
if ( cur )
{
postOrder( cur->m_lft.get(), m);
postOrder( cur->m_rht.get(), m);
m.push_back(cur->m_val);
}
}
void levelOrder(BST* tree, std::vector<T>& m) {
std::queue<BST*> stk({tree});
while( !stk.empty() )
{
BST* cur = stk.front();
stk.pop();
if ( cur )
{
m.push_back( cur->m_val );
stk.push ( cur->m_lft.get() );
stk.push ( cur->m_rht.get() );
}
}
}
void inOrderTraverse (BST *tree) {
std::vector<T> m;
inOrder(tree, m);
std::cout << toString(m) << std::endl;
}
void preOrderTraverse (BST *tree) {
std::vector<T> m;
preOrder(tree, m);
std::cout << toString(m) << std::endl;
}
void postOrderTraverse (BST *tree) {
std::vector<T> m;
postOrder(tree, m);
std::cout << toString(m) << std::endl;
}
void levelOrderTraverse(BST* tree) {
std::vector<T> m;
levelOrder(tree, m);
std::cout << toString(m) << std::endl;
}
std::string toString(const std::vector<T>& v, std::string delim = " " ) {
std::stringstream ss;
std::copy( std::begin(v), std::end(v), std::ostream_iterator<T>(ss, delim.c_str()) );
std::string l_ret( ss.str() );
return l_ret.size() > delim.size() ? std::string(l_ret.begin(), l_ret.end()-delim.size() ) : l_ret;
}
};
int main() {
int n, v1; std::cin >> n;
std::vector<int> v(n,0);
for (int i = 0; i < n; i++) { std::cin >> v[i]; }
BST<int> bst(v[0]);
bst.insert(v);
bst.preOrderTraverse (&bst);
bst.inOrderTraverse (&bst);
bst.postOrderTraverse (&bst);
bst.levelOrderTraverse(&bst);
}