二叉搜尋樹實現檔案C++

來源:互聯網
上載者:User

//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_PrecedingOrderTreversal (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 />}<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 />}<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 />}<br />}</p><p>void BinarySearchTree :: m_Release (const Node * const pn)<br />{<br />if (pn)<br />{<br />m_Release (pn -> left) ;<br />m_Release (pn -> right) ;<br />delete pn ;<br />}<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 />}<br />}</p><p>Item BinarySearchTree :: m_FindMin (const Node * pRight) const<br />{<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 BinarySearchTree :: 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 />}<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 />}<br />else<br />{<br />m_root = scan -> left ;<br />delete scan ;<br />}<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 />}<br />else<br />{<br />m_root = scan -> right ;<br />delete scan ;<br />}<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_IntermediateOrderTraversal (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 />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.