區間樹實現檔案C++

來源:互聯網
上載者:User

//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 />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.