void SplayTree::_rotate(Node* parent, Node* vertex) { Node* grandParent = parent->parent; Node::push(grandParent); Node::push(parent); Node::push(vertex); if(grandParent) { if(grandParent->leftChild == parent) { grandParent->leftChild = vertex; } else { grandParent->rightChild = vertex; } } if(parent->leftChild == vertex) { parent->leftChild = vertex->rightChild; vertex->rightChild = parent; } else { parent->rightChild = vertex->leftChild; vertex->leftChild = parent; } _keepParent(parent); _keepParent(vertex); _setParent (vertex, grandParent); }
SplayTree* SplayTree::_split(size_t position) { size_t treeSize = (_root ? _root->sizeOfSubtree : 0); if(position > treeSize) { return NULL; // throw std::out_of_range("out of range in SplayTree::split\n"); } if(position == treeSize) { return new SplayTree(nullptr); } Node* newRoot = _find(position, _root); SplayTree* rightTree = new SplayTree(newRoot); _root = newRoot->leftChild; newRoot->leftChild = nullptr; _setParent(_root, nullptr); if(rightTree->_root) { rightTree->_root->treePtr = rightTree; } Node::push(rightTree->_root); Node::push(_root); return rightTree; }
void CBone::updateParentAnimation() { HSceneObject currentSO = SO(); while (currentSO != nullptr) { HAnimation parent = currentSO->getComponent<CAnimation>(); if (parent != nullptr) { if (currentSO->getActive()) _setParent(parent); else _setParent(HAnimation()); return; } currentSO = currentSO->getParent(); } _setParent(HAnimation()); }
void SplayTree::_keepParent(Node* vertex) { _setParent(vertex->leftChild, vertex); _setParent(vertex->rightChild, vertex); Node::updateNodeParams(vertex); }