#ifndef _BSPTREE_BTREE_HPP_ #error BTREE.HPP must precede BTREE.TPP #endif #ifndef _BSPTREE_BTREE_TPP_ #define _BSPTREE_BTREE_TPP_ template BTree &BTree::operator=(const BTree &someBTree) { Block items; remove(); if(!someBTree.leaves())return *this; someBTree.treeItems(items); for(int index=0;index void BTree::treeItems(Array &arrayItems)const { DWORD itemIndex(0); arrayItems.size(leaves()); retrieveNodes(mlpRootNode,arrayItems,itemIndex); } template void BTree::treeItems(Block &blockItems)const { blockItems.remove(); retrieveNodes(mlpRootNode,blockItems); } template void BTree::retrieveNodes(TreeNode *lpRootNode,Block &blockNodes)const { if(!lpRootNode)return; retrieveNodes(lpRootNode->leftNode(),blockNodes); blockNodes.insert(&lpRootNode->item()); retrieveNodes(lpRootNode->rightNode(),blockNodes); } template void BTree::retrieveNodes(TreeNode *lpRootNode,Array &arrayNodes,DWORD &arrayIndex)const { if(!lpRootNode)return; retrieveNodes(lpRootNode->leftNode(),arrayNodes,arrayIndex); arrayNodes[arrayIndex++]=lpRootNode->item(); retrieveNodes(lpRootNode->rightNode(),arrayNodes,arrayIndex); } template TreeNode *BTree::insertNode(TreeNode *lpRootNode,TreeNode *lpCurrentNode,const T &someItem) { if(!lpCurrentNode) { lpCurrentNode=mlpLastNodeInserted=::new TreeNode(someItem); assert(0!=lpCurrentNode); if(!lpRootNode)return lpCurrentNode; if(someItemitem())lpRootNode->leftNode(lpCurrentNode); else lpRootNode->rightNode(lpCurrentNode); return lpCurrentNode; } if(someItemitem())return insertNode(lpCurrentNode,lpCurrentNode->leftNode(),someItem); else if(lpCurrentNode->item()rightNode(),someItem); return 0; } template TreeNode *BTree::insertNodeDuplicate(TreeNode *lpRootNode,TreeNode *lpCurrentNode,const T &someItem) { if(!lpCurrentNode) { lpCurrentNode=mlpLastNodeInserted=::new TreeNode(someItem); assert(0!=lpCurrentNode); if(!lpRootNode)return lpCurrentNode; if(someItemitem())lpRootNode->leftNode(lpCurrentNode); else if(someItem==lpRootNode->item())lpRootNode->leftNode(lpCurrentNode); else lpRootNode->rightNode(lpCurrentNode); return lpCurrentNode; } if(someItemitem())return insertNodeDuplicate(lpCurrentNode,lpCurrentNode->leftNode(),someItem); else if(someItem==lpCurrentNode->item())return insertNodeDuplicate(lpCurrentNode,lpCurrentNode->leftNode(),someItem); return insertNodeDuplicate(lpCurrentNode,lpCurrentNode->rightNode(),someItem); } template T *BTree::searchNode(TreeNode *lpRootNode,const T &someItem) { while(lpRootNode&&!(someItem==lpRootNode->item())) { if(someItemitem())lpRootNode=lpRootNode->leftNode(); else lpRootNode=lpRootNode->rightNode(); } if(!lpRootNode)return 0; return &lpRootNode->item(); } template bool BTree::searchNodeDuplicate(TreeNode *lpRootNode,const T &someItem,Block > &items) { items.remove(); while(lpRootNode&&!(someItem==lpRootNode->item())) { if(someItemitem())lpRootNode=lpRootNode->leftNode(); else lpRootNode=lpRootNode->rightNode(); } while(lpRootNode&&someItem==lpRootNode->item()) { // items.insert(&SmartPointer(&lpRootNode->item())); items.insert(new SmartPointer(&lpRootNode->item())); lpRootNode=lpRootNode->leftNode(); } return items.size()?true:false; } template TreeNode *BTree::deleteBTree(TreeNode *lpRootNode) { if(!lpRootNode)return 0; deleteBTree(lpRootNode->leftNode()); deleteBTree(lpRootNode->rightNode()); ::delete lpRootNode; return lpRootNode=0; } template WORD BTree::insert(Array &vectorItems) { WORD size((WORD)vectorItems.size()); WORD insertCount(0); if(!size)return 0; for(LONG index=0;index void BTree::remove(const T &someItem) { remove(someItem,mlpRootNode,0); } template void BTree::remove(const T &someItem,TreeNode *pCurrNode,TreeNode *pParentNode) { TreeNode *pTmpNode; if(!pCurrNode)return; if(someItemitem())remove(someItem,pCurrNode->leftNode(),pCurrNode); else if(someItem>pCurrNode->item())remove(someItem,pCurrNode->rightNode(),pCurrNode); else { if(!pCurrNode->leftNode()&&!pCurrNode->rightNode()) { if(pCurrNode==mlpRootNode)mlpRootNode=0; if(pParentNode) { if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(0); else pParentNode->rightNode(0); } } else if(!pCurrNode->rightNode()) { if(pParentNode) { if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pCurrNode->leftNode()); else pParentNode->rightNode(pCurrNode->leftNode()); } else mlpRootNode=pCurrNode->leftNode(); } else if(!pCurrNode->leftNode()) { if(pParentNode) { if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pCurrNode->rightNode()); else pParentNode->rightNode(pCurrNode->rightNode()); } else mlpRootNode=pCurrNode->rightNode(); } else { TreeNode *pCursorNode=0; TreeNode *pRootNode=0; pTmpNode=pCurrNode->leftNode(); while(pTmpNode->rightNode()){pCursorNode=pTmpNode;pTmpNode=pTmpNode->rightNode();} if(pCursorNode)pCursorNode->rightNode(0); pRootNode=pTmpNode; pRootNode->rightNode(pCurrNode->rightNode()); pCursorNode=0; if(pTmpNode!=pCurrNode->leftNode()) { while(pTmpNode->leftNode())pTmpNode=pTmpNode->leftNode(); pTmpNode->leftNode(pCurrNode->leftNode()); } if(!pParentNode)mlpRootNode=pRootNode; else { if(pParentNode->leftNode()==pCurrNode)pParentNode->leftNode(pCurrNode->leftNode()); else pParentNode->rightNode(pCurrNode->leftNode()); } } ::delete pCurrNode; leaves(leaves()-1); } } #include #endif