C++ Implementation of AVL Trees
仅供学习使用,复制粘贴需谨慎。
仅供学习使用,复制粘贴需谨慎。
仅供学习使用,复制粘贴需谨慎。
#include <iostream>
#include <sstream>
using namespace std;
class AVLNode
{
public:
int key;
AVLNode *leftNode;
AVLNode *rightNode;
int height;
AVLNode()
{
leftNode = NULL;
rightNode = NULL;
key = -1;
height = 0;
}
};
int getHeight(AVLNode *N)
{
return N == NULL ? 0:N->height;
}
AVLNode *rightRotate(AVLNode *y)
{
AVLNode *x = y->leftNode;
AVLNode *T2 = x->rightNode;
x->rightNode = y;
y->leftNode = T2;
y->height = max(getHeight(y->leftNode), getHeight(y->rightNode)) + 1;
x->height = max(getHeight(x->leftNode), getHeight(x->rightNode)) + 1;
return x;
}
AVLNode *leftRotate(AVLNode *x)
{
AVLNode *y = x->rightNode;
AVLNode *swp = y->leftNode;
y->leftNode = x;
x->rightNode = swp;
x->height = max(getHeight(x->leftNode), getHeight(x->rightNode)) + 1;
y->height = max(getHeight(y->leftNode), getHeight(y->rightNode)) + 1;
return y;
}
int getBalance(AVLNode *node)
{
return node == NULL ? 0:getHeight(node->leftNode) - getHeight(node->rightNode);
}
AVLNode *insert(AVLNode *node, int key)
{
if (node == NULL) {
AVLNode *newNode = new AVLNode();
newNode->key = key;
newNode->leftNode = NULL;
newNode->rightNode = NULL;
newNode->height = 1;
return newNode;
}
if (key < node->key) {
node->leftNode = insert(node->leftNode, key);
}
else if (key > node->key) {
node->rightNode = insert(node->rightNode, key);
}
else {
return node;
}
node->height = 1 + max(getHeight(node->leftNode), getHeight(node->rightNode));
int balance = getBalance(node);
if (balance > 1 && key < node->leftNode->key) {
return rightRotate(node);
}
if (balance < -1 && key > node->rightNode->key) {
return leftRotate(node);
}
if (balance > 1 && key > node->leftNode->key)
{
node->leftNode = leftRotate(node->leftNode);
return rightRotate(node);
}
if (balance < -1 && key < node->rightNode->key)
{
node->rightNode = rightRotate(node->rightNode);
return leftRotate(node);
}
return node;
}
AVLNode *minValueAVLNode(AVLNode *node)
{
AVLNode *current = node;
while (current->leftNode != NULL)
current = current->leftNode;
return current;
}
AVLNode *deleteAVLNode(AVLNode *root, int key)
{
if (root == NULL) {
return root;
}
if (key < root->key) {
root->leftNode = deleteAVLNode(root->leftNode, key);
}
else if (key > root->key) {
root->rightNode = deleteAVLNode(root->rightNode, key);
}
else {
if ((root->leftNode == NULL) || (root->rightNode == NULL)) {
AVLNode *tmp = root->leftNode ? root->leftNode : root->rightNode;
if (tmp == NULL) {
tmp = root;
root = NULL;
}
else {
*root = *tmp;
}
free(tmp);
} else {
AVLNode *tmp = minValueAVLNode(root->rightNode);
root->key = tmp->key;
root->rightNode = deleteAVLNode(root->rightNode,
tmp->key);
}
}
if (root == NULL) {
return root;
}
root->height = 1 + max(getHeight(root->leftNode), getHeight(root->rightNode));
int balance = getBalance(root);
if (balance > 1 && getBalance(root->leftNode) >= 0) {
return rightRotate(root);
}
if (balance > 1 && getBalance(root->leftNode) < 0) {
root->leftNode = leftRotate(root->leftNode);
return rightRotate(root);
}
if (balance < -1 && getBalance(root->rightNode) <= 0) {
return leftRotate(root);
}
if (balance < -1 && getBalance(root->rightNode) > 0) {
root->rightNode = rightRotate(root->rightNode);
return leftRotate(root);
}
return root;
}
void preOrder(AVLNode *root)
{
if(root == NULL) return;
cout << root->key << " ";
preOrder(root->leftNode);
preOrder(root->rightNode);
}
void postOrder(AVLNode *root)
{
if(root == NULL) return;
postOrder(root->leftNode);
postOrder(root->rightNode);
cout << root->key << " ";
}
void inOrder(AVLNode *root)
{
if(root == NULL) return;
inOrder(root->leftNode);
cout << root->key << " ";
inOrder(root->rightNode);
}
bool findNode(AVLNode *root, int value) {
if (root == NULL) {
return false;
}
if (root->key == value) {
return true;
}
else if (value < root->key) {
return findNode(root->leftNode, value);
}
else if (root->key < value) {
return findNode(root->rightNode, value);
}
return false;
}
int main()
{
AVLNode *root = NULL;
string input;
getline(cin, input);
istringstream mystring(input);
string op;
while (mystring >> op) {
char choice = op[0];
if(choice == 'A')
{
if (findNode(root, stoi(op.substr(1)))) {
} else {
root = insert(root, stoi(op.substr(1)));
}
}
if(choice == 'D') {
root = deleteAVLNode(root, stoi(op.substr(1)));
}
if(choice == 'I')
{
if (root == NULL) {
cout << "EMPTY" << endl;
}
else {
inOrder(root);
}
}
if(choice == 'P')
{
if (op[1] == 'R') {
if (root == NULL) {
cout << "EMPTY" << endl;
}
else {
preOrder(root);
}
}
else {
if (root == NULL) {
cout << "EMPTY" << endl;
}
else
postOrder(root);
}
}
}
return 0;
}
浙公网安备 33010602011771号