BTreeNode * BPlusTree::GetLeafNode(int key) { BTreeNode * temp = root; while(temp!= NULL) { if(temp->isLeaf()) { return temp; } else { bool found = false; for (unsigned int i = 0 ; i < temp->getkeys().size() ; i++) { if(key <= temp->getkeys()[i]) { temp = temp->getChidNodes()[i]; found = true; break; } } if(!found) { temp = temp->getChidNodes()[temp->getChidNodes().size() -1]; } } } return NULL; }
void BPlusTree::splitParent(BTreeNode * node , int key , BTreeNode * leftNode , BTreeNode * rightNode) { if(node == NULL) { root = new BTreeNode(); root->getkeys().push_back(key); root->getChidNodes().push_back(leftNode); root->getChidNodes().push_back(rightNode); return; } node->insertIntoNode(key , leftNode , rightNode); int splitIndex = node->getkeys().size()/2; BTreeNode * left = node; BTreeNode * right = new BTreeNode(); int keyToElevate = node->getkeys()[splitIndex]; right->copyContent(left , splitIndex+1 , node->getkeys().size()-1); left->getkeys().resize(splitIndex); left->getChidNodes().resize(splitIndex); if(node->getparent() == NULL || node->getparent()->isFull()) splitParent(node->getparent() ,keyToElevate, left , right ); else { node->insertIntoNode(keyToElevate , left , right); left->setParent(node); right->setParent(node); } return; }