📄 vektor.h
字号:
newNode = new element; // element for the vektor newNode->key = newKey; // store newKey newNode->stored = newStored; // store newStored newNode->color = true; // new nodes are always RED newNode->parent = NULL; // new node initially has no parent newNode->left = leaf; // left leaf newNode->right = leaf; // right leaf newNode->heap_ptr = heap->insertItem(newitem); // add new item to the vektor heap support++; // increment node count in vektor // must now search for where to insert newNode, i.e., find the correct parent and // set the parent and child to point to each other properly current = root; if (current->key==0) { // insert as root delete root; // delete old root root = newNode; // set root to newNode leaf->parent = newNode; // set leaf's parent current = leaf; // skip next loop } while (current != leaf) { // search for insertion point if (newKey < current->key) { // left-or-right? if (current->left != leaf) { current = current->left; } // try moving down-left else { // else found new parent newNode->parent = current; // set parent current->left = newNode; // set child current = leaf; // exit search } } else { // if (current->right != leaf) { current = current->right; } // try moving down-right else { // else found new parent newNode->parent = current; // set parent current->right = newNode; // set child current = leaf; // exit search } } } // now do the house-keeping necessary to preserve the red-black properties insertCleanup(newNode); // do house-keeping to maintain balance } return;}// private house-keeping function for insertionvoid vektor::insertCleanup(element *z) { if (z->parent==NULL) { // fix now if z is root z->color = false; return; } element *temp; while (z->parent!=NULL && z->parent->color) { // while z is not root and z's parent is RED if (z->parent == z->parent->parent->left) { // z's parent is LEFT-CHILD temp = z->parent->parent->right; // grab z's uncle if (temp->color) { z->parent->color = false; // color z's parent BLACK (Case 1) temp->color = false; // color z's uncle BLACK (Case 1) z->parent->parent->color = true; // color z's grandparent RED (Case 1) z = z->parent->parent; // set z = z's grandparent (Case 1) } else { if (z == z->parent->right) { // z is RIGHT-CHILD z = z->parent; // set z = z's parent (Case 2) rotateLeft(z); // perform left-rotation (Case 2) } z->parent->color = false; // color z's parent BLACK (Case 3) z->parent->parent->color = true; // color z's grandparent RED (Case 3) rotateRight(z->parent->parent); // perform right-rotation (Case 3) } } else { // z's parent is RIGHT-CHILD temp = z->parent->parent->left; // grab z's uncle if (temp->color) { z->parent->color = false; // color z's parent BLACK (Case 1) temp->color = false; // color z's uncle BLACK (Case 1) z->parent->parent->color = true; // color z's grandparent RED (Case 1) z = z->parent->parent; // set z = z's grandparent (Case 1) } else { if (z == z->parent->left) { // z is LEFT-CHILD z = z->parent; // set z = z's parent (Case 2) rotateRight(z); // perform right-rotation (Case 2) } z->parent->color = false; // color z's parent BLACK (Case 3) z->parent->parent->color = true; // color z's grandparent RED (Case 3) rotateLeft(z->parent->parent); // perform left-rotation (Case 3) } } } root->color = false; // color the root BLACK return;}// Delete Functions -------------------------------------------------------------------// public delete functionvoid vektor::deleteItem(int killKey) { element *x, *y, *z; char pauseme; z = findItem(killKey); if (z == NULL) { return; } // item not present; bail out if (z != NULL) { tuple newmax = heap->returnMaximum(); // get old maximum in O(1) heap->deleteItem(z->heap_ptr); // delete item in the max-heap O(log k) } if (support==1) { // -- attempt to delete the root root->key = 0; // restore root node to default state root->stored = -4294967296.0; // root->color = false; // root->parent = NULL; // root->left = leaf; // root->right = leaf; // root->heap_ptr = NULL; // support--; // set support to zero return; // exit - no more work to do } if (z != NULL) { support--; // decrement node count if ((z->left == leaf) || (z->right==leaf)) { // case of less than two children y = z; } // set y to be z else { y = returnSuccessor(z); } // set y to be z's key-successor if (y->left!=leaf) { x = y->left; } // pick y's one child (left-child) else { x = y->right; } // (right-child) x->parent = y->parent; // make y's child's parent be y's parent if (y->parent==NULL) { root = x; } // if y is the root, x is now root else { // if (y == y->parent->left) { // decide y's relationship with y's parent y->parent->left = x; // replace x as y's parent's left child } else { // y->parent->right = x; } // replace x as y's parent's left child } // if (y!=z) { // insert y into z's spot z->key = y->key; // copy y data into z z->stored = y->stored; // z->heap_ptr = y->heap_ptr; // } // if (y->color==false) { deleteCleanup(x); } // do house-keeping to maintain balance delete y; // deallocate y y = NULL; // point y to NULL for safety } // return;}void vektor::deleteCleanup(element *x) { element *w, *t; while ((x != root) && (x->color==false)) { // until x is the root, or x is RED if (x==x->parent->left) { // branch on x being a LEFT-CHILD w = x->parent->right; // grab x's sibling if (w->color==true) { // if x's sibling is RED w->color = false; // color w BLACK (case 1) x->parent->color = true; // color x's parent RED (case 1) rotateLeft(x->parent); // left rotation on x's parent (case 1) w = x->parent->right; // make w be x's right sibling (case 1) } if ((w->left->color==false) && (w->right->color==false)) { w->color = true; // color w RED (case 2) x = x->parent; // examine x's parent (case 2) } else { // if (w->right->color==false) { // w->left->color = false; // color w's left child BLACK (case 3) w->color = true; // color w RED (case 3) t = x->parent; // store x's parent rotateRight(w); // right rotation on w (case 3) x->parent = t; // restore x's parent w = x->parent->right; // make w be x's right sibling (case 3) } // w->color = x->parent->color; // make w's color = x's parent's (case 4) x->parent->color = false; // color x's parent BLACK (case 4) w->right->color = false; // color w's right child BLACK (case 4) rotateLeft(x->parent); // left rotation on x's parent (case 4) x = root; // finished work. bail out (case 4) } // } else { // x is RIGHT-CHILD w = x->parent->left; // grab x's sibling if (w->color==true) { // if x's sibling is RED w->color = false; // color w BLACK (case 1) x->parent->color = true; // color x's parent RED (case 1) rotateRight(x->parent); // right rotation on x's parent (case 1) w = x->parent->left; // make w be x's left sibling (case 1) } if ((w->right->color==false) && (w->left->color==false)) { w->color = true; // color w RED (case 2) x= x->parent; // examine x's parent (case 2) } else { // if (w->left->color==false) { // w->right->color = false; // color w's right child BLACK (case 3) w->color = true; // color w RED (case 3) t = x->parent; // store x's parent rotateLeft(w); // left rotation on w (case 3) x->parent = t; // restore x's parent w = x->parent->left; // make w be x's left sibling (case 3) } // w->color = x->parent->color; // make w's color = x's parent's (case 4) x->parent->color = false; // color x's parent BLACK (case 4) w->left->color = false; // color w's left child BLACK (case 4) rotateRight(x->parent); // right rotation on x's parent (case 4) x = root; // x is now the root (case 4) } } } x->color = false; // color x (the root) BLACK (exit) return;}// Rotation Functions -------------------------------------------------------------------void vektor::rotateLeft(element *x) { element *y; // do pointer-swapping operations for left-rotation y = x->right; // grab right child x->right = y->left; // make x's RIGHT-CHILD be y's LEFT-CHILD y->left->parent = x; // make x be y's LEFT-CHILD's parent y->parent = x->parent; // make y's new parent be x's old parent if (x->parent==NULL) { root = y; } // if x was root, make y root else { // if (x == x->parent->left) // if x is LEFT-CHILD, make y be x's parent's { x->parent->left = y; } // left-child else { x->parent->right = y; } // right-child } // y->left = x; // make x be y's LEFT-CHILD x->parent = y; // make y be x's parent return;}void vektor::rotateRight(element *y) { element *x; // do pointer-swapping operations for right-rotation x = y->left; // grab left child y->left = x->right; // replace left child yith x's right subtree x->right->parent = y; // replace y as x's right subtree's parent x->parent = y->parent; // make x's new parent be y's old parent if (y->parent==NULL) { root = x; } // if y was root, make x root else { if (y == y->parent->right) // if y is RIGHT-CHILD, make x be y's parent's { y->parent->right = x; } // right-child else { y->parent->left = x; } // left-child } x->right = y; // make y be x's RIGHT-CHILD y->parent = x; // make x be y's parent return;}// Display Function -------------------------------------------------------------------// publicvoid vektor::printTree() { tuple max = heap->returnMaximum(); cout << "\nTREE SIZE = " << support << endl; cout << "HEAP SIZE = " << heap->heapSize() << endl; cout << "MAXIMUM (" << max.j<< " " << max.m << ")" << endl; cout << "# "; printSubTree(root); return;}void vektor::printHeap() { heap->printHeap(); return; }//privatevoid vektor::printSubTree(element *z) { if (z==leaf) { return; } else { cout << "(" << z->key << " " << z->stored << " " << z->color << ") [" << z->heap_ptr << "]"<<endl; cout << "L "; printSubTree(z->left); cout << endl; cout << "R "; printSubTree(z->right); cout << endl; } return;}// ------------------------------------------------------------------------------------#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -