Space-efficient geometric algorithms and data structures

By Ilya Katz and Hervé Brönnimann    

explicit_tree_heap.hpp

Go to the documentation of this file.
00001 //TODO: remove unneeded functions
00002 //TODO: most of the work in remove_top, should be done in remove
00003 //TODO: insert(line) should return pointer to the node just created
00004 //TODO: DataNode() should be private
00005 
00006 /*
00007  * Copyright © Ilya Katz and Hervé Brönnimann, 2005.
00008  */
00019 #ifndef EXCPLICIT_TREE_HEAP_HPP
00020 #define EXCPLICIT_TREE_HEAP_HPP
00021 
00022 
00023 #include "tree_heap.hpp"
00024 #include "cgl.hpp"
00025 #include "data_node.hpp"
00026 
00027 #include <boost/array.hpp>
00028 #include <vector>
00029 #include <algorithm>
00030 //#include <iostream>
00031 
00032 
00033 namespace inplaceds
00034 {
00035         template<typename Geometry>
00036         class explicit_tree_node: public TreeNode<Geometry>
00037         {
00038                 public:
00039 
00040                         typedef typename Geometry::point_type point_type;
00041                         typedef typename Geometry::line_type line_type;
00042                         typedef DataNode<Geometry> Data;
00043                         typedef explicit_tree_node<Geometry>* nodePtr;
00044 
00045                         explicit_tree_node():
00046                                 //data(NULL),
00047                                 leftBST(NULL),rightBST(NULL),parentBST(NULL),
00048                                 leftPQ(NULL),rightPQ(NULL),parentPQ(NULL)
00049                                 {}
00050                         explicit_tree_node(const line_type& l):
00051                                 data(Data(l)),
00052                                 leftBST(NULL),rightBST(NULL),parentBST(NULL),
00053                                 leftPQ(NULL),rightPQ(NULL),parentPQ(NULL)
00054     {}
00055                         explicit_tree_node(const Data& d):
00056                                 data(d),
00057                                 leftBST(NULL),rightBST(NULL),parentBST(NULL),
00058                                 leftPQ(NULL),rightPQ(NULL),parentPQ(NULL)
00059                                 {}
00060 
00061 
00062                         ~explicit_tree_node(){/*delete data;*/}
00063 
00064                 public:
00065 
00066                         nodePtr leftBST;
00067                         nodePtr rightBST;
00068                         nodePtr parentBST;
00069 
00070                         nodePtr leftPQ;
00071                         nodePtr rightPQ;
00072                         nodePtr parentPQ;
00073 
00074                         Data data;
00075 
00076         };
00077 
00078 
00079         template<typename Geometry, typename BSTCompare, typename PQCompare>
00080         class explicit_tree_heap: public tree_heap<Geometry>
00081         {
00082 
00083                 public:
00084                         typedef typename Geometry::coord_type                   coord_type;
00085                         typedef          explicit_tree_node<Geometry>   TNode;
00086                         typedef typename TNode::point_type                              point_type;
00087                         typedef typename TNode::nodePtr                                 nodePtr;
00088                         typedef typename TNode::Data                                    Data;
00089                         typedef typename Data::line_type                                line_type;
00090 
00091                 private:
00092 
00094                         #define DEFINE_POINTER_MAP( name, m_pointer )                                    \
00095                       struct name {                                                      \
00096                         nodePtr& operator[](nodePtr t) const { return (*t).m_pointer; }  \
00097                       };
00098 
00099 
00100                 DEFINE_POINTER_MAP(PQ_leftPointer, leftPQ)
00101                 DEFINE_POINTER_MAP(PQ_rightPointer, rightPQ)
00102                 DEFINE_POINTER_MAP(PQ_parentPointer, parentPQ)
00103 
00104                 DEFINE_POINTER_MAP(BST_leftPointer, leftBST)
00105                 DEFINE_POINTER_MAP(BST_rightPointer, rightBST)
00106                 DEFINE_POINTER_MAP(BST_parentPointer, parentBST)
00107 
00108                 #undef DEFINE_POINTER_MAP
00110 
00111 
00112                         struct BST_Data
00113                         {
00114                                 Data& operator[](nodePtr t) const { return (*t).data; }
00115                         };
00116 
00117                         typedef BST_leftPointer leftBSTptr;
00118                         typedef BST_rightPointer rightBSTptr;
00119                         typedef BST_parentPointer parentBSTptr;
00120 
00121                         typedef PQ_leftPointer leftPQptr;
00122                         typedef PQ_rightPointer rightPQptr;
00123                         typedef PQ_parentPointer parentPQptr;
00124 
00125 
00126                         typedef BST_Data BST_Data;
00127 
00128                 private:
00129                         nodePtr rootBST;
00130                         nodePtr rootPQ;
00131 
00132                         BSTCompare BSTcomp;
00133                         PQCompare PQcomp;
00134 
00135                         rightBSTptr right;
00136                         leftBSTptr left;
00137                         parentBSTptr parent;
00138 
00139                         rightPQptr rightPQ;
00140                         leftPQptr leftPQ;
00141                         parentPQptr parentPQ;
00142 
00143                         BST_Data data;
00144 
00145                 public:
00146 
00150                         explicit_tree_heap();
00151 
00159                         explicit_tree_heap(BSTCompare& b, PQCompare& p);
00160                         ~explicit_tree_heap(){}
00161 
00166                         bool
00167                         empty()
00168                         {
00169                                 return rootPQ==NULL;
00170                         }
00171 
00176                         inline void
00177                         print()
00178                         {
00179 
00180                                 if(rootPQ!=NULL){
00181                                         std::cerr<<"Priority Queue:"<<std::endl;
00182                                         preOrderPQ(rootPQ);
00183                                 }
00184 
00185                                 if(rootBST!=NULL){
00186                                         std::cerr<<std::endl<<"BST"<<std::endl;
00187                                         preOrder(rootBST);
00188                                 }
00189                         }
00190 
00195                         void
00196                         remove_top();
00197 
00202                         inline nodePtr
00203                         remove_node(nodePtr node)
00204                         {
00205                                 nodePtr tmp = m_remove_node_PQ(node);
00206                                 tmp =m_remove_BST(tmp);
00207                         }
00208 
00212                         inline void insert(const line_type& l) ;
00213 
00217                         nodePtr get_top();
00218 
00219                         /*
00220                          * @copydoc tree_heap::remove
00221                          */
00222                         bool remove(const line_type& l)
00223                         {}
00224 
00229                         inline nodePtr
00230                         successor(nodePtr x){
00231                                 m_successor(x, parent, left, right);
00232                         }
00233 
00238                         inline nodePtr
00239                         predecessor(nodePtr x){
00240                           return m_successor(x, parent, right, left);
00241                         }
00242 
00256                         void
00257                         swap_nodes(nodePtr a, nodePtr b);
00264                         inline void
00265                         adjust_PQ(nodePtr node)
00266                         {
00267                                 percolate_down(node);
00268                                 percolate_up(node);
00269                         }
00270 
00275                         inline void insert_BST(nodePtr t)
00276                         {
00277                                 nodePtr result;
00278                                 rootBST= insert_without_balance(t, rootBST, result);
00279                         }
00280 
00285                         void segment_right_event(nodePtr it)
00286                         {
00287                                 it->data.right_event();
00288                                         adjust_PQ(it);
00289                         }
00290 
00295                         void segment_intersection_event(nodePtr it, point_type point, Data* intersecting)
00296                         {
00297                                 it->data.intersection_event(point, intersecting);
00298                                 adjust_PQ(it);
00299                         }
00300 
00301         private:
00302 
00303                         template<class Parent, class Left, class Right>
00304                         inline nodePtr
00305                         m_successor(nodePtr x, Parent parent, Left left, Right right){
00306 
00307                           if (right[x] != NULL) {
00308                             x = right[x];
00309                             while (left[x] != NULL)
00310                               x = left[x];
00311                           }
00312                           else {
00313                             nodePtr y = parent[x];
00314                             while (y!=NULL &&x == right[y]) {
00315                               x = y;
00316                               y = parent[y];
00317                             }
00318                             x = y;
00319 
00320                           }
00321                           return x;
00322                         }
00323 
00324                         nodePtr
00325                         insert_without_balance(nodePtr newLine, nodePtr t, nodePtr& result = NULL)
00326                         {
00327                                 if(t==NULL)
00328                                 {
00329                                         t=newLine;
00330                                         result=t;
00331 
00332                                 }
00333                                 else
00334                                 {
00335                                         if(BSTcomp(data[newLine], data[t]))
00336                                         {
00337                                                 left[t]=( insert_without_balance(newLine, left[t], result));
00338                                                 parent[left[t]]=(t);
00339                                         }
00340                                         else //(BSTcomp(data[t],data[newLine]))
00341                                         {
00342                                                 right[t]=( insert_without_balance(newLine, right[t], result));
00343                                                 parent[right[t]]=(t);
00344                                         }
00345                                 }
00346 
00347                                 return t;
00348 
00349                         }
00350 
00356                         void
00357                         percolate_up(nodePtr node);
00358 
00364                         void
00365                         percolate_down(nodePtr node);
00366 
00372                         void
00373                         update_node(nodePtr hole, nodePtr newNode);
00378                         nodePtr
00379                         m_remove_node_PQ(nodePtr root)
00380                         {
00381                                 nodePtr hole=root;
00382 
00383                                 while(hole!=NULL)
00384                                 {
00385                                         if(leftPQ[hole]!=NULL)
00386                                         {
00387                                                 if(rightPQ[hole]!=NULL)
00388                                                 {
00389                                                         //if(!PQcomp(data[leftPQ[hole]], data[rightPQ[hole]]))
00390                                                         if(PQcomp(data[leftPQ[hole]], data[rightPQ[hole]]))
00391                                                         {
00392                                                                 update_node(hole, leftPQ[hole]);
00393                                                                 //hole=leftPQ[hole];
00394                                                         }
00395                                                         else
00396                                                         {
00397                                                                 update_node(hole, rightPQ[hole]);
00398                                                                 //hole=rightPQ[hole];
00399                                                         }
00400                                                 }
00401                                                 else
00402                                                 {//only left child present
00403                                                                 update_node(hole, leftPQ[hole]);
00404                                                                 //hole=leftPQ[hole];
00405                                                 }
00406                                         }
00407                                         else if(rightPQ[hole]!=NULL)
00408                                         //only right child present
00409                                         {
00410                                                 update_node(hole, rightPQ[hole]);
00411                                                 //hole=rightPQ[hole];
00412                                         }
00413                                         else{
00414                                         //no children, stop
00415                                         return hole;
00416                                         }
00417                                 }
00418                         }
00419 
00420 
00428                         nodePtr
00429                         m_remove_BST(nodePtr z)
00430                         {
00431                                 nodePtr y,x;
00432                             if(left[z] == NULL  || right[z] == NULL)
00433                             {
00434                                     y = z;
00435                             }
00436                             else
00437                             {
00438                                 y = successor(z);
00439                             }
00440 
00441                                 if(left[y] != NULL)
00442                                 {
00443                                     x = left[y];
00444                                 }
00445                                 else
00446                                 {
00447                                         x = right[y];
00448                                 }
00449 
00450                                 if(x != NULL)
00451                                 {
00452                                         parent[x] = parent[y];
00453                                 }
00454 
00455                                 if(parent[y] == NULL)
00456                                 {
00457                                        rootBST= x;
00458                                 }
00459                                 else if (y == left [parent[y]])
00460                                 {
00461                                     left[parent[y]]=x;
00462                                 }
00463                                 else
00464                                 {
00465                                         right[parent[y]]=x;
00466                                 }
00467 
00468                                 if(y != z)
00469                                 {
00470                                         //y is the successor of z, hence doesn't have a left child
00471                                     left[y]=left[z];
00472                                     right[y]=right[z];
00473                                     parent[y]=parent[z];
00474 
00475                                     if(parent[y]==NULL)
00476                                     {
00477                                         rootBST=y;
00478                                     }
00479                                     else
00480                                     {
00481                                         if(left[parent[y]]==z)
00482                                         {
00483                                                 left[parent[y]]=y;
00484                                         }
00485                                         else
00486                                         {
00487                                                 right[parent[y]]=y;
00488                                         }
00489                                     }
00490 
00491                                     if(left[y]!=NULL)
00492                                     {
00493                                         parent[left[y]]=y;
00494                                     }
00495 
00496                                     if(right[y]!=NULL)
00497                                     {
00498                                         parent[right[y]]=y;
00499                                     }
00500 
00501                                     left[z]=right[z]=parent[z]=NULL;
00502 
00503                                     return z;
00504                                 }
00505 
00506                            left[y]=right[y]=parent[y]=NULL;
00507                            return y;
00508                         }
00509 
00510                         void preOrder(nodePtr root)
00511                         {
00512 
00513                                 std::cerr<<*root<<" ";
00514                                 if(left[root]!=NULL)
00515                                         preOrder(left[root]);
00516                                 if(right[root]!=NULL)
00517                                         preOrder(right[root]);
00518                         }
00519 
00520                         void preOrderPQ(nodePtr root)
00521                         {
00522                                 std::cerr<<*root<<" ";
00523                                 if(leftPQ[root]!=NULL)
00524                                         preOrderPQ(leftPQ[root]);
00525                                 if(rightPQ[root]!=NULL)
00526                                         preOrderPQ(rightPQ[root]);
00527 
00528                         }
00529 
00537                         nodePtr BST_insert(const line_type& l, nodePtr t, nodePtr& result = NULL);
00538 
00539                         nodePtr PQ_insert(nodePtr);
00540                         /*
00541                          * Function that allocates a new node
00542                          * Returns pointer to the node just allocated
00543                          */
00544                         nodePtr allocateNode(const line_type&);
00545                         nodePtr allocateNode(Data&);
00546 
00547                         void swap(nodePtr, nodePtr);
00548 
00549                         //disallow copies
00550                         explicit_tree_heap(const explicit_tree_heap& p){};
00551                         explicit_tree_heap operator =(const explicit_tree_heap& p){};
00552 
00553         };
00554 
00555         template<typename Geometry, typename BSTCompare, typename PQCompare>
00556         typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr
00557                  explicit_tree_heap<Geometry, BSTCompare, PQCompare>::get_top()
00558         {
00559                 return rootPQ;
00560         }
00561 
00562         template<typename Geometry, typename BSTCompare, typename PQCompare>
00563         explicit_tree_heap<Geometry, BSTCompare, PQCompare>::explicit_tree_heap():
00564                         rootBST(NULL), rootPQ(NULL)
00565 
00566         {}
00567         template<typename Geometry, typename BSTCompare, typename PQCompare>
00568         explicit_tree_heap<Geometry, BSTCompare, PQCompare>::explicit_tree_heap(BSTCompare& b, PQCompare& p):
00569                 BSTcomp(b),PQcomp(p),rootBST(NULL), rootPQ(NULL)
00570         {}
00571 
00573         template<typename Geometry, typename BSTCompare, typename PQCompare>
00574         typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr
00575                 explicit_tree_heap<Geometry, BSTCompare, PQCompare>::PQ_insert( nodePtr newNode)
00576         {
00577 
00578                 if(rootPQ == NULL){
00579                         rootPQ = newNode;
00580                         return newNode;
00581                 }
00582 
00583                 nodePtr hole = rootPQ;
00584 
00585                 //dont need hole!=null
00586                 while(hole!=NULL && PQcomp(data[hole], data[newNode])/*PQcomp(data[newNode], data[hole])*/){
00587 
00588                         if(hole->leftPQ == NULL){
00589                                 leftPQ[hole]= newNode;
00590                                 parentPQ[newNode] = hole;
00591                                 return leftPQ[hole];
00592                         }
00593                         if(hole->rightPQ == NULL){
00594                                 rightPQ[hole] = newNode;
00595                                 parentPQ[newNode] = hole;
00596                                 return rightPQ[hole];
00597                         }
00598                         hole = PQcomp(data[rightPQ[hole]], data[leftPQ[hole]])? /*PQcomp(data[leftPQ[hole]], data[rightPQ[hole]])?*/
00599                                         leftPQ[hole]:
00600                                         rightPQ[hole];
00601                 }
00602 
00603                 if(hole==rootPQ){
00604                         rootPQ=newNode;
00605                         leftPQ[newNode]=hole;
00606                         //if hole!=null
00607                         parentPQ[hole]=newNode;
00608                         return newNode;
00609                 }
00610                 if(leftPQ[parentPQ[hole]] == hole){
00611                         leftPQ[parentPQ[hole]]=newNode;
00612                 }
00613                 else{
00614                         rightPQ[parentPQ[hole]]=newNode;
00615                 }
00616 
00617                 parentPQ[newNode]=parentPQ[hole];
00618                 parentPQ[hole]=newNode;
00619                 leftPQ[newNode]=hole;
00620                 rightPQ[newNode]=NULL;
00621                 return newNode;
00622         }
00623 
00624         template<typename Geometry, typename BSTCompare, typename PQCompare>
00625         void explicit_tree_heap<Geometry, BSTCompare, PQCompare>::swap(nodePtr a, nodePtr b)
00626         {
00627                 std::swap(*a,*b);
00628         }
00629 
00630         template<typename Geometry, typename BSTCompare, typename PQCompare>
00631         void explicit_tree_heap<Geometry, BSTCompare, PQCompare>::insert(const line_type& l)
00632         {
00633                 nodePtr result=NULL;
00634                 //rootBST=BST_insert(l, rootBST, result);
00635                 nodePtr t=allocateNode(l);
00636 
00637         //      rootBST= insert_without_balance(t, rootBST, result);
00638 
00639                 PQ_insert(t);
00640 
00641 
00642         }
00643 
00644 
00645         template<typename Geometry>
00646         std::ostream& operator<<(std::ostream& os, inplaceds::explicit_tree_node<Geometry>& node)
00647         {
00648                 os<<"("<<node.data.line[0][0]<<","<<node.data.line[0][1]<<")-("
00649                 <<node.data.line[1][0]<<","<<node.data.line[1][1]
00650         //      <<" h:"<<node.height
00651                 <<",\t r: "<<(node.rightBST!=NULL?node.rightBST->data.line[0][1]:0)
00652                 <<",l: "<<(node.leftBST!=NULL?node.leftBST->data.line[0][1]:0)<<"\t"
00653                 <<",p: ("<<(node.parentBST!=NULL?node.parentBST->data.line[0][0]:0)<<""
00654                 <<",: "<<(node.parentBST!=NULL?node.parentBST->data.line[0][1]:0)<<")\t"
00655         //      <<" "<<&node
00656                 <<" "<<int(node.data.myEvent)<<" "<<node.data.point[0]
00657                 <<" )"<<std::endl;
00658 
00659         //      <<node.height//<<" left "<<node.leftBST<<" pare"<<node.parentBST
00660         //      <<")";//<<" L:"<<node.leftBST
00661         //              <<" R:"<<node.rightBST<<" )";//<<","<<node.data.line[0][1]<<")";
00662         }
00663 
00664 
00665 
00666 
00667         template<typename Geometry, typename BSTCompare, typename PQCompare>
00668         typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr
00669                 explicit_tree_heap<Geometry, BSTCompare, PQCompare>::allocateNode(const line_type& l)
00670         {
00671                 return new TNode(l);
00672         }
00673 
00674         template<typename Geometry, typename BSTCompare, typename PQCompare>
00675         typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr
00676                 explicit_tree_heap<Geometry, BSTCompare, PQCompare>::allocateNode(Data& d)
00677         {
00678                 return new TNode(d);
00679         }
00680 
00681         template<typename Geometry, typename BSTCompare, typename PQCompare>
00682         void
00683         explicit_tree_heap<Geometry, BSTCompare, PQCompare>::swap_nodes(
00684                 typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr a,
00685                 typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr b)
00686         {
00687                 std::swap(left[a],left[b]);
00688                 std::swap(right[a],right[b]);
00689                 std::swap(parent[a],parent[b]);
00690 
00691                 if(parent[b]!=NULL)
00692                 {
00693                         if(parent[b]==b)
00694                         {
00695                                 parent[b]=a;
00696                         }
00697                         if(left[parent[b]]==a)
00698                         {
00699                                 left[parent[b]]=b;
00700                         }
00701                         else
00702                         {
00703                                 right[parent[b]]=b;
00704                         }
00705                 }
00706                 else
00707                 {
00708                         rootBST=b;
00709                 }
00710 
00711                 if(parent[a]!=NULL)
00712                 {
00713                         if(parent[a]==a)
00714                         {
00715                                 parent[a]=b;
00716                         }
00717                         if(left[parent[a]]==b)
00718                         {
00719                                 left[parent[a]]=a;
00720                         }
00721                         else
00722                         {
00723                                 right[parent[a]]=a;
00724                         }
00725 
00726                 }
00727                 else
00728                 {
00729                         rootBST=a;
00730                 }
00731 
00732 
00733                 if(left[a]!=NULL)
00734                 {
00735                         if(left[a]==a)
00736                         {
00737                                 left[a]=b;
00738                         }
00739                         parent[left[a]]=a;
00740                 }
00741 
00742 
00743                 if(right[a]!=NULL)
00744                 {
00745                         if(right[a]==a)
00746                         {
00747                                 right[a]=b;
00748                         }
00749                         parent[right[a]]=a;
00750                 }
00751 
00752 
00753 
00754                 if(left[b]!=NULL)
00755                 {
00756                         if(left[b]==b)
00757                         {
00758                                 left[b]=a;
00759                         }
00760                         parent[left[b]]=b;
00761                 }
00762                 if(right[b]!=NULL)
00763                 {
00764                         if(right[b]==b)
00765                         {
00766                                 right[b]=a;
00767                         }
00768                         parent[right[b]]=b;
00769                 }
00770         }
00771 
00772         template<typename Geometry, typename BSTCompare, typename PQCompare>
00773         void
00774         explicit_tree_heap<Geometry, BSTCompare, PQCompare>::percolate_up(
00775                 typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr node)
00776         {
00777                 nodePtr hole = node;
00778                 while(parentPQ[hole]!=NULL)
00779                 {
00780                         /*if(!PQcomp(data[hole],data[parentPQ[hole]]))*/
00781                         if(PQcomp(data[hole],data[parentPQ[hole]]))
00782                         {
00783                                 update_node(parentPQ[hole],hole);
00784                         }
00785                         else
00786                         {
00787                                 break;
00788                         }
00789                 }
00790         }
00791 
00792         template<typename Geometry, typename BSTCompare, typename PQCompare>
00793         void
00794         explicit_tree_heap<Geometry, BSTCompare, PQCompare>::percolate_down(
00795                 typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr node)
00796         {
00797                 nodePtr hole=node;
00798 
00799                 while(true)
00800                 {
00801                         if(leftPQ[hole]==NULL)
00802                         {
00803                                 if(rightPQ[hole]!=NULL)//only right child
00804                                 {
00805                                         if(PQcomp(data[rightPQ[hole]],data[hole]))
00806                                         {
00807                                                 update_node(hole, rightPQ[hole]);
00808                                         }
00809                                         else break;
00810                                 }
00811                                 else break;     //no children
00812                         }
00813                         else if(rightPQ[hole]==NULL)
00814                         {
00815                                 if(leftPQ[hole]!=NULL)//only left child
00816                                 {
00817                                         if(PQcomp(data[leftPQ[hole]],data[hole]))
00818                                         {
00819                                                 update_node(hole, leftPQ[hole]);
00820                                         }
00821                                         else break;
00822                                 }
00823                         }
00824                         else //both children
00825                         {
00826                                 //choose the smaller one
00827                                 if(PQcomp(data[leftPQ[hole]], data[rightPQ[hole]]))
00828                                 {
00829                                         if(PQcomp(data[leftPQ[hole]],data[hole]))
00830                                         {
00831                                                 update_node(hole, leftPQ[hole]);
00832                                         }
00833                                         else break;
00834                                 }
00835                                 else
00836                                 {
00837                                         if(PQcomp(data[rightPQ[hole]],data[hole]))
00838                                         {
00839                                                 update_node(hole, rightPQ[hole]);
00840                                         }
00841                                         else break;
00842 
00843                                 }
00844 
00845                         }
00846                 }
00847 
00848         }
00849 
00850         template<typename Geometry, typename BSTCompare, typename PQCompare>
00851         void
00852         explicit_tree_heap<Geometry, BSTCompare, PQCompare>::update_node(
00853                 typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr hole,
00854                 typename explicit_tree_heap<Geometry, BSTCompare, PQCompare>::nodePtr newNode)
00855         {
00856                 if(parentPQ[hole]==NULL)
00857                 {
00858                         parentPQ[newNode]=NULL;
00859                         rootPQ=newNode;
00860                 }
00861                 else
00862                 {
00863                         std::swap(parentPQ[newNode], parentPQ[hole]);
00864 
00865                         if(leftPQ[parentPQ[newNode]]==hole)
00866                         {
00867                                 leftPQ[parentPQ[newNode]]=newNode;
00868                         }
00869                         else
00870                         {
00871                                 rightPQ[parentPQ[newNode]]=newNode;
00872                         }
00873                 }
00874 
00875                 std::swap(leftPQ[hole],leftPQ[newNode]);
00876                 if(leftPQ[hole]!=NULL)
00877                 {
00878                         parentPQ[leftPQ[hole]]=hole;
00879                 }
00880                 if(leftPQ[newNode]==newNode)
00881                 {
00882                         leftPQ[newNode]=hole;
00883                 }
00884                 if(leftPQ[newNode]!=NULL)
00885                 {
00886                         parentPQ[leftPQ[newNode]]=newNode;
00887                 }
00888 
00889                 std::swap(rightPQ[hole],rightPQ[newNode]);
00890                 if(rightPQ[hole]!=NULL)
00891                 {
00892                         parentPQ[rightPQ[hole]]=hole;
00893                 }
00894                 if(rightPQ[newNode]==newNode)
00895                 {
00896                         rightPQ[newNode]=hole;
00897                 }
00898                 if(rightPQ[newNode]!=NULL)
00899                 {
00900                         parentPQ[rightPQ[newNode]]=newNode;
00901                 }
00902 
00903         }
00904 
00905 
00906         template<typename Geometry, typename BSTCompare, typename PQCompare>
00907         void
00908         explicit_tree_heap<Geometry, BSTCompare, PQCompare>::remove_top()
00909         {
00910                 if(leftPQ[rootPQ]!=NULL || rightPQ[rootPQ]!=NULL)
00911                 {
00912                         nodePtr tmp = m_remove_node_PQ(rootPQ);
00913                         tmp = m_remove_BST(tmp);
00914 
00915                         if(parentPQ[tmp]!=NULL){
00916                                 if(leftPQ[parentPQ[tmp]]==tmp)
00917                                 {
00918                                         leftPQ[parentPQ[tmp]]=NULL;
00919                                 }
00920                                 else if(rightPQ[parentPQ[tmp]]==tmp)
00921                                 {
00922                                         rightPQ[parentPQ[tmp]]=NULL;
00923                                 }
00924                         }
00925                         tmp->data.line[0][0]=-99;
00926                         tmp->data.line[0][1]=-99;
00927                         delete tmp;
00928                 }
00929                 else
00930                 {
00931                         delete rootPQ;
00932                         rootBST=NULL;
00933                         rootPQ=NULL;
00934                 }
00935 
00936         }
00937 
00938 } //namespace
00939 #endif
00940 
00941 
00942 
00943 

Code Documentation generated Using Doxygen

Copyright © Ilya Katz and Hervé Brönnimann, 2005, 2006.