13template<
typename ElementType>
19 ascending_order = in_order, post_order, descending_order };
34 os <<
"node_" << this->m_value;
42 <<
" [ shape=oval, label = \" "
43 << this->m_value <<
" \"] ;";
56 this->m_left->get_node_name(os) <<
";" <<
nl;
59 this->m_left->print_node(os);
66 this->m_right->get_node_name(os) <<
";" <<
nl;
69 this->m_right->print_node(os);
76 os <<
"digraph G { " <<
nl;
85 ElementType
get()
const {
return this->m_value; }
92 if(value == this->m_value)
98 if(this->m_left && (ptr = this->m_left->
find(value)))
101 if(this->m_right && (ptr = this->m_right->
find(value)))
108 m_value{value}, m_parent{parent} { }
114 if(value == this->m_value)
116 else if(value < this->m_value)
120 return this->m_left->insert(value);
123 this->m_left.reset(
new binary_node{value,
this} );
131 return this->m_right->insert(value);
134 this->m_right.reset(
new binary_node{value,
this});
142 template<
typename Type,
typename... Types>
145 bool result = this->
insert(arg);
147 if constexpr(
sizeof...(args) != 0)
150 return result && this->
insert(args...);
165 os << this->m_value <<
nl;
168 this->m_left->visit_nodes(os, order);
171 this->m_right->visit_nodes(os, order);
178 this->m_left->visit_nodes(os, order);
181 this->m_right->visit_nodes(os, order);
183 os << this->m_value <<
nl;
191 this->m_right->visit_nodes(os, order);
193 os << this->m_value <<
nl;
196 this->m_left->visit_nodes(os, order);
205 this->m_left->visit_nodes(os, order);
207 os << this->m_value <<
nl;
210 this->m_right->visit_nodes(os, order);
242 root.visit_nodes(os, visit_mode::ascending_order);
248 root.visit_nodes(os, visit_mode::descending_order);
263 root.
insert(8, 15, 7, 9, 12, 17, 6, 16, 18, 25);
265 if(
auto ptr = root.find(6))
267 stream <<
"Value found: " << ptr->get() <<
endl;
274 if(
auto ptr = root.find(20) )
276 stream <<
"Value found: " << ptr->get() <<
endl;
295 root.
insert(8, 15, 7, 9, 12, 17, 6, 16, 18);
302int main(
int argc,
const char* argv[])
317 stream <<
"Usage: " << argv[0] <<
" node list " <<
endl;
318 stream <<
"Example: "<<argv[0] <<
" 10 8 15 7 9 12 17 6 16 18 > binary_tree.gv" <<
endl;
319 stream <<
"dot -Tpng binary_tree.gv -o binary_tree.png" <<
endl;
326 for(
int i = 2; i < argc; ++i)
328 root.
insert( std::atoi(argv[i]) );
void test_ascending_descending_order()
void test_find_binary_tree()
int main(int argc, const char *argv[])
void test_build_digraph()
typename binary_node< ElementType >::node_ptr_t node_ptr_t
typename graph_t::visit_mode visit_mode
bool insert(Type arg, Types... args)
binary_node * find(ElementType value)
tpf::sstream & get_node_name(tpf::sstream &os)
void print_node(tpf::sstream &os)
std::unique_ptr< binary_node > node_ptr_t
tpf::sstream & get_node_definition(tpf::sstream &os)
bool insert(ElementType value)
binary_node(ElementType value=ElementType{}, binary_node *parent=nullptr)
void visit_nodes(tpf::sstream &os, visit_mode order=visit_mode::in_order)
Stream output operators << are implemented.