我正在研究 AVL 树。我想我已经让所有的旋转功能都正常工作了。我有一个 rotateleft、rotateright、rotateleftright 和 rotaterightleft 函数。它们都将一个节点作为参数。我不知道将哪个节点传递给这些参数。你能看看我的 AVL 树再平衡函数,告诉我它是否正确,以及我需要传递给这些函数中的每一个。到目前为止,我有根节点或顶部节点,但我认为我错了。我如何知道我需要传递给这些函数的内容?
这是功能:
void BinaryTree::rebalance(Node *N)
{
int count = 1;
if((N->getLeft()->getHeight()) > (N->getRight()->getHeight() + 1))
{
if(N->getLeft()->getLeft()->getHeight() > N->getLeft()->getRight()->getHeight())
{
rotateRight(root);
recalculate(root, count);
}
else
{
rotateLeftRight(root);
recalculate(root, count);
}
}
else if(N->getRight()->getHeight()> N->getLeft()->getHeight() + 1)
{
if(N->getRight()->getRight()->getHeight() > N->getRight()->getLeft()->getHeight())
{
rotateLeft(root);
recalculate(root, count);
}
else
{
rotateRightLeft(root);
recalculate(root, count);
}
}
}
这是我的左右旋转
Node* BinaryTree::rotateLeftRight(Node *N)
{
Node *newNode = new Node();//declares a new Node
newNode = N->getLeft();//sets the node
N->setLeft(rotateLeft(newNode->getLeft());//sets the left subtree
recalculate(root);//recalculates the height
root->setHeight(NULL);//sets the height of the root node
return rotateRight(N);//retuns the tree rotated right
}
这是我向左旋转的功能。:
Node* BinaryTree::rotateLeft(Node *N)
{
Node *newNode = new Node();//declares a new node
newNode = N->getRight();//sets the new node to the right child of N
N->setRight(newNode->getLeft());//sets the right of N equal to new nodes left child
newNode->setLeft(N);//sets the left child of the new node to N
return newNode;//retuns the newNode
}
如果我有树 50 20 10 和 15 我将传递给这些函数中的每一个以重新平衡树吗?