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;
}
Пример #3
0
	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);
}