//intervalTree.cpp -- 區間樹實現檔案<br />#include "stdafx.h"<br />#include "intervalTree.h"</p><p>namespace tree<br />{<br />//private:<br />bool IntervalTree :: m_Overlap (const Item min, const Item max) const<br />{<br />if (m_min <= max)<br />{<br />if (min <= m_max)<br />return true ;<br />else<br />return false ;<br />}<br />else<br />return false ;<br />}</p><p>Item IntervalTree :: m_Max (const Item a, const Item b, const Item c) const<br />{<br />Item max = a ;</p><p>if (max < b)<br />max = b ;<br />if (max < c)<br />max = c ;</p><p>return max ;<br />}</p><p>Node * IntervalTree :: m_MakeNode (void) const<br />{<br />Node * newNode = new Node ;</p><p>if (newNode)<br />{<br />newNode -> min = m_min ;<br />newNode -> max = m_max ;<br />newNode -> maxOfAll = m_max ;<br />newNode -> number = m_number ;<br />newNode -> left = newNode -> right = NULL ;<br />}</p><p>return newNode ;<br />}</p><p>Node * IntervalTree :: m_Updata (Node * const pn) const<br />{<br />Item leftMax, rightMax ;</p><p>leftMax = rightMax = NEGATIVE_INFINITY ;<br />if (pn -> left)<br />leftMax = pn -> left -> maxOfAll ;<br />if (pn -> right)<br />rightMax = pn -> right -> maxOfAll ;<br />pn -> maxOfAll = m_Max (leftMax, rightMax, pn -> max) ;</p><p>return pn ;<br />}</p><p>Node * IntervalTree :: m_Insert (Node * pn)<br />{<br />if (pn)<br />{<br />if (m_min < pn -> min)<br />pn -> left = m_Insert (pn -> left) ;<br />else<br />pn -> right = m_Insert (pn -> right) ;<br />if (false == m_outOfSpace)<br />pn = m_Updata (pn) ;<br />}<br />else<br />{<br />pn = m_MakeNode () ;<br />if (!pn)<br />m_outOfSpace = true ;<br />}</p><p>return pn ;<br />}</p><p>Node * IntervalTree :: m_Delete (Node * pn)<br />{<br />if (pn)<br />{<br />if (m_min < pn -> min)<br />pn -> left = m_Delete (pn -> left) ;<br />else if (m_min > pn -> min)<br />pn -> right = m_Delete (pn -> right) ;<br />else<br />{<br />if (m_max == pn -> max)<br />{<br />if (pn -> left && pn -> right)<br />{<br />m_FindNewMinAndMax (pn -> right) ;<br />pn -> min = m_min ;<br />pn -> max = m_max ;<br />pn -> right = m_Delete (pn -> right) ;<br />}<br />else if (pn -> left)<br />{<br />Node * temp = pn ;<br />pn = pn -> left ;<br />delete temp ;<br />}<br />else<br />{<br />Node * temp = pn ;<br />pn = pn -> right ;<br />delete temp ;<br />}<br />}<br />else<br />pn -> right = m_Delete (pn -> right) ;<br />}<br />if (true == m_hasDiscovered && pn)<br />pn = m_Updata (pn) ;<br />}<br />else<br />m_hasDiscovered = false ;</p><p>return pn ;<br />}</p><p>Node * IntervalTree :: m_Search (Node * pn) const<br />{<br />Node * pMinMin ;</p><p>if (pn)<br />{<br />if (pn -> left && pn -> left -> maxOfAll >= m_min)<br />{<br />pMinMin = m_Search (pn -> left) ;<br />if (pMinMin)<br />return pMinMin ;<br />else if (m_Overlap (pn -> min, pn -> max))<br />return pn ;<br />else<br />return NULL ;<br />}<br />else if (m_Overlap (pn -> min, pn -> max))<br />return pn ;<br />else<br />return m_Search (pn -> right) ;<br />}<br />else<br />return NULL ;<br />}</p><p>int IntervalTree :: m_SearchAll (const Node * const pn)<br />{<br />static int count = 0 ;</p><p>if (pn)<br />{<br />if (pn -> left && m_min <= pn -> left -> maxOfAll)<br />m_SearchAll (pn -> left) ;<br />if (m_Overlap (pn -> min, pn -> max))<br />{<br />std :: cout << "No." << pn -> number << std :: endl ;<br />++count ;<br />}<br />if (pn -> right && m_min <= pn -> right -> maxOfAll)<br />m_SearchAll (pn -> right) ;<br />}</p><p>return count ;<br />}</p><p>void IntervalTree :: m_FindNewMinAndMax (const Node * pn)<br />{<br />while (pn -> left)<br />pn = pn -> left ;<br />m_min = pn -> min ;<br />m_max = pn -> max ;<br />}</p><p>void IntervalTree :: m_Release (const Node * const pn) const<br />{<br />if (pn)<br />{<br />m_Release (pn -> left) ;<br />m_Release (pn -> right) ;<br />delete pn ;<br />}<br />}</p><p>void IntervalTree :: m_InOrderTraversal (const Node * const pn) const<br />{<br />if (pn)<br />{<br />m_InOrderTraversal (pn -> left) ;<br />std :: cout << "(" << pn -> min << ", " << pn -> max << ") Max: " << pn -> maxOfAll << std :: endl ;<br />m_InOrderTraversal (pn -> right) ;<br />}<br />}<br />//public:<br />IntervalTree :: IntervalTree (void)<br />{<br />m_root = NULL ;<br />m_outOfSpace = false ;<br />m_hasDiscovered = true ;<br />}</p><p>bool IntervalTree :: Insert (const Item min, const Item max, const int number)<br />{<br />m_min = min ;<br />m_max = max ;<br />m_number = number ;<br />m_root = m_Insert (m_root) ;<br />if (true == m_outOfSpace)<br />{<br />m_outOfSpace = false ;<br />return false ;<br />}<br />else<br />return true ;<br />}</p><p>bool IntervalTree :: Delete (const Item min, const Item max)<br />{<br />m_min = min ;<br />m_max = max ;</p><p>m_root = m_Delete (m_root) ;<br />if (false == m_hasDiscovered)<br />{<br />m_hasDiscovered = true ;<br />return false ;<br />}<br />else<br />return true ;<br />}</p><p>Node * IntervalTree :: Search (const Item min, const Item max)<br />{<br />m_min = min ;<br />m_max = max ;</p><p>return m_Search (m_root) ;<br />}</p><p>int IntervalTree :: SearchAll (const Item min, const Item max)<br />{<br />m_min = min ;<br />m_max = max ;</p><p>return m_SearchAll (m_root) ;<br />}</p><p>void IntervalTree :: InOrderTraversal (void) const<br />{<br />m_InOrderTraversal (m_root) ;<br />}</p><p>IntervalTree :: ~IntervalTree (void)<br />{<br />m_Release (m_root) ;<br />}<br />}