// 13-1.cpp <br/> # include "stdafx. H "<br/> # include" 13-1.h "</P> <p> namespace binarysearchtree <br/>{< br/> // Private: </P> <p> node * binarysearchtree: m_makenode (const item & item) <br/>{< br/> node * newnode = new node; </P> <p> If (newnode) <br/>{< br/> newnode-> item = item; <br/> newnode-> left = newnode-> right = NULL; <br/>}</P> <p> return newnode; <br/>}</P> <p> void binarysearchtree: m_precedi Ngordertreversal (const node * const PN) const <br/>{< br/> If (PN) <br/>{< br/> STD :: cout <PN-> item <STD: Endl; <br/> m_precedingordertreversal (PN-> left); <br/> m_precedingordertreversal (PN-> right ); <br/>}</P> <p> void binarysearchtree: m_intermediateordertraversal (const node * const PN) const <br/>{< br/> If (PN) <br/>{< br/> m_intermediateordertraversal (PN-> left); <br/> STD: cout <PN-> item <STD: Endl; <br/> m_intermediateordertraversal (PN-> right ); <br/>}</P> <p> void binarysearchtree: m_hindordertraversal (const node * const PN) const <br/>{< br/> If (PN) <br/>{< br/> m_hindordertraversal (PN-> left ); <br/> m_hindordertraversal (PN-> right); <br/> STD: cout <PN-> item <STD: Endl; <br/>}</P> <p> void binarysearchtree: m_releas E (const node * const PN) <br/>{< br/> If (PN) <br/>{< br/> m_release (PN-> left ); <br/> m_release (PN-> right); <br/> Delete PN; <br/>}</P> <p> void binarysearchtree :: m_copy (const node * const PN) <br/>{< br/> If (PN) <br/>{< br/> insert (PN-> item ); <br/> m_copy (PN-> left); <br/> m_copy (PN-> right ); <br/>}</P> <p> item binarysearchtree: m_findmin (const node * pright) const <B R/>{< br/> while (pright-> left) <br/> pright = pright-> left; </P> <p> return pright-> item; <br/>}</P> <p> // public: <br/> binarysearchtree: binarysearchtree (void) <br/>{< br/> m_root = NULL; <br/> m_current = 0; <br/>}</P> <p> binarysearchtree: binarysearchtree (const binarysearchtree & T) <br/>{< br/> m_root = NULL; <br/> m_current = 0; <br/> m_copy (T. m_root); <br/>}</P> <p> item binarysearcht REE: findmin (void) const <br/>{< br/> node * scan = m_root; </P> <p> while (scan-> left) <br/> scan = scan-> left; </P> <p> return scan-> item; <br/>}</P> <p> item binarysearchtree :: findmax (void) const <br/>{< br/> node * scan = m_root; </P> <p> while (scan-> right) <br/> scan = scan-> right; </P> <p> return scan-> item; <br/>}</P> <p> int binarysearchtree :: count (void) const <br/>{< br/> return M _ Current; <br/>}</P> <p> bool binarysearchtree: isempty (void) const <br/>{< br/> return 0 = m_current; <br/>}</P> <p> bool binarysearchtree: Find (const item & item) const <br/>{< br/> node * scan = m_root; </P> <p> while (Scan & scan-> item! = Item) <br/>{< br/> If (item <scan-> item) <br/> scan = scan-> left; <br/> else <br/> scan = scan-> right; <br/>}< br/> If (! Scan) <br/> return false; <br/> else <br/> return true; <br/>}</P> <p> bool binarysearchtree :: insert (const item & item) <br/>{< br/> node * newnode = m_makenode (item); </P> <p> If (! Newnode) <br/> return false; <br/> If (isempty () <br/>{< br/> m_root = newnode; <br/> m_current = 1; <br/> return true; <br/>}< br/> node * scan = m_root; <br/> while (1) <br/>{< br/> If (item <scan-> item) <br/>{< br/> If (! Scan-> left) <br/>{< br/> scan-> left = newnode; <br/> break; <br/>}< br/> else <br/> scan = scan-> left; <br/>}< br/> else <br/>{< br/> If (! Scan-> right) <br/>{< br/> scan-> right = newnode; <br/> break; <br/>}< br/> else <br/> scan = scan-> right; <br/>}< br/> + m_current; </P> <p> return true; <br/>}</P> <p> bool binarysearchtree: delete (const item & item) <br/> {<br/> node * scan = m_root, * parent = NULL; </P> <p> while (Scan & scan-> item! = Item) <br/>{< br/> parent = scan; <br/> If (item <scan-> item) <br/> scan = scan-> left; <br/> else <br/> scan = scan-> right; <br/>}< br/> // not in tree <br/> If (! Scan) <br/> return false; <br/> // If has two chidren <br/> If (scan-> left & scan-> right) <br/>{< br/> item temp = m_findmin (scan-> right); <br/> Delete (temp); <br/> scan-> item = temp; <br/>}< br/> // else if has left child only <br/> else if (scan-> left) <br/>{< br/> If (parent) <br/>{< br/> If (SCAN = parent-> left) <br/>{< br/> parent-> left = scan-> left; <br/> Delete scan; <br/>}< br/> Else <br/>{< br/> parent-> right = scan-> left; <br/> Delete scan; <br/>}< br/> else <br/>{< br/> m_root = scan-> left; <br/> Delete scan; <br/>}< br/> // else if has right child only <br/> // or is a leaf <br/> else <br/ >{< br/> If (parent) <br/>{< br/> If (SCAN = parent-> left) <br/>{< br/> parent-> left = scan-> right; <br/> Delete scan; <br/>}< br/> else <br/>{< br/> parent-> right = Scan-> right; <br/> Delete scan; <br/>}< br/> else <br/>{< br/> m_root = scan-> right; <br/> Delete scan; <br/>}< br/> -- m_current; </P> <p> return true; <br/>}</P> <p> void binarysearchtree: precedingordertreversal (void) const <br/>{< br/> m_precedingordertreversal (m_root ); <br/>}</P> <p> void binarysearchtree: intermediateordertraversal (void) const <br/>{< br/> m_intermediateo Rdertraversal (m_root); <br/>}</P> <p> void binarysearchtree: hindordertraversal (void) const <br/>{< br/> m_hindordertraversal (m_root ); <br/>}</P> <p> binarysearchtree & binarysearchtree: Operator = (const binarysearchtree & T) <br/>{< br/> If (this = & T) <br/> return * This; <br/> m_release (m_root ); <br/> m_root = NULL; <br/> m_current = 0; <br/> m_copy (T. m_root); </P> <p> return * This; <br/>}</ P> <p> binarysearchtree ::~ Binarysearchtree (void) <br/>{< br/> m_release (m_root); <br/>}< br/>}