#ifndef CA_UWATERLOO_ALUMNI_DWHARDER_SIMPLE_TREE #define CA_UWATERLOO_ALUMNI_DWHARDER_SIMPLE_TREE #include "Single_list.h" // Author: Douglas Wilhelm Harder // Copyright (c) 2011 by Douglas Wilhelm Harder. All rights reserved. namespace Data_structures { template class Simple_tree { private: Type element; Simple_tree *parent_node; ece250::Single_list children; public: Simple_tree( Type const &, Simple_tree * = 0 ); Type retrieve() const; int degree() const; bool is_root() const; bool is_leaf() const; Simple_tree *parent() const; Simple_tree *child( int n ) const; void depth_first_traversal() const; void insert( Type const & ); void insert( Simple_tree * ); void detach(); }; template Simple_tree::Simple_tree( Type const &obj, Simple_tree *p ): element( obj ), parent_node( p ) { // Empty constructor } template Type Simple_tree::retrieve() const { return element; } template int Simple_tree::degree() const { return children.size(); } template bool Simple_tree::is_root() const { return ( parent_node == 0 ); } template bool Simple_tree::is_leaf() const { return ( degree() == 0 ); } template Simple_tree *Simple_tree::parent() const { return parent_node; } template Simple_tree *Simple_tree::child( int n ) const { if ( n < 0 || n >= degree() ) { return 0; } ece250::Single_node *ptr = children.head(); for ( int i = 1; i < n; ++i ) { ptr = ptr->next(); } return ptr->retrieve(); } template void Simple_tree::size() const { int s = 1; for ( ece250::Single_node *ptr = children.head(); ptr != 0; ptr = ptr->next() ) { s += ptr->retrieve()->size(); } return s; } template void Simple_tree::height() const { int h = 0; for ( ece250::Single_node *ptr = children.head(); ptr != 0; ptr = ptr->next() ) { h = std::max( h, 1 + ptr->retrieve()->height() ); } return h; } template void Simple_tree::insert( Type const &obj ) { children.push_back( new Simple_tree( obj, this ) ); } template void Simple_tree::insert( Simple_tree *tree ) { if ( !tree->is_root() ) { tree->detach(); } tree->parent_node = this; children.push_back( tree ); } template void Simple_tree::detach() { if ( parent_node == 0 ) { return; } parent_node->children.erase( this ); parent_node = 0; } template void Simple_tree::depth_first_traversal() const { std::cout << retrieve() << ' '; for ( ece250::Single_node *ptr = children.head(); ptr != 0; ptr = ptr->next() ) { ptr->retrieve()->depth_first_traversal(); } } } #endif