AVL树--C++实现

#pragma once

#include <iostream>
#include <algorithm>

template <typename T>
class AVLTreeNode {
public:
    T  key;
    int height;
    AVLTreeNode* left;
    AVLTreeNode* right;
    AVLTreeNode(T value, AVLTreeNode *l, AVLTreeNode* r) 
        : key(value), height(0), left(l), right(r) {}
};

template <typename T>
class AVLTree {
public:
    typedef AVLTreeNode<T> Node;
    typedef AVLTreeNode<T>* Node_pointer;

public:
    AVLTree() : rootTree(nullptr) { }
    ~AVLTree() { clear(); }

//查找
    //前序遍历
    void preOrder() { preOrder(rootTree); }
    //中序遍历
    void inOrder() { inOrder(rootTree); }
    //后序遍历
    void postOrder() { postOrder(rootTree); }
    //最大值
    T max() { 
        Node* x = max(rootTree); 
        if (x == nullptr) return (T)nullptr;
        return x->key;
    }
    //最小值
    T min() {
        Node* x = min(rootTree);
        if (x == nullptr) return (T)nullptr;
        return x->key;
    }
//修改
    //插入
    void insert(T value) { insert(rootTree, value); }
    //删除
    void remove(T value);
    //清除
    void clear();
    //获取高度
    int height(Node*);

private:
    //LL旋转 右旋转
    Node* LL_rotation(Node*);
    //RR旋转 左旋转
    Node* RR_rotation(Node*);
    //LR旋转 RR ==> LL
    Node* LR_rotation(Node*);
    //RL旋转 LL ==> RR
    Node* RL_rotation(Node*);
    //
    Node* insert(Node_pointer&, T);

    void preOrder(Node *tree);
    void inOrder(Node *tree);
    void postOrder(Node *tree);

    Node * remove(Node_pointer& tree, Node *z);
    void destroy(Node_pointer& tree);

    Node* max(Node *tree);
    Node* min(Node *tree);
    Node* search(Node* tree, T key);
private:
    Node* rootTree;
};

//获取高度
template <typename T>
int AVLTree<T>::height(Node* node)
{
    if (node == nullptr) return 0;
    return node->height;
}

//LL旋转
template <typename T>
typename AVLTree<T>::Node* AVLTree<T>::LL_rotation(Node* k2)
{
    Node* k1;
    k1 = k2->left;
    k2->left = k1->right;
    k1->right = k2;

    k1->height = std::max(height(k1->left), height(k1->right)) + 1;
    k2->height = std::max(height(k2->left), height(k2->right)) + 1;

    return k1;
}

//RR旋转
template <typename T>
typename AVLTree<T>::Node* AVLTree<T>::RR_rotation(Node* k1)
{
    Node* k2;
    k2 = k1->right;
    k1->right = k2->left;
    k2->left = k1;

    k1->height = std::max(height(k1->left), height(k1->right)) + 1;
    k2->height = std::max(height(k2->left), height(k2->right)) + 1;

    return k2;
}

//LR旋转 RR ==> LL
template <typename T>
typename AVLTree<T>::Node* AVLTree<T>::LR_rotation(Node* k3)
{
    k3->left = RR_rotation(k3->left);
    return LL_rotation(k3);
}

//RL旋转 LL ==> RR
template <typename T>
typename AVLTree<T>::Node* AVLTree<T>::RL_rotation(Node* k1)
{
    k1->right = LL_rotation(k1->right);
    return RR_rotation(k1);
}

template <typename T>
typename AVLTree<T>::Node* AVLTree<T>::insert(Node_pointer &tree, T value)
{
    //1. tree is nullptr
    if (tree == nullptr) {
        tree = new Node(value, nullptr, nullptr);
        if (tree == nullptr) {
            std::cout << "insert error: new node failed! " << std::endl;
            return nullptr;
        }
    }
    //插到左边
    else if (value < tree->key) {
        tree->left = insert(tree->left, value);
        //插入节点后,若失去平衡,则需要调整
        if (height(tree->left) - height(tree->right) == 2) {
            if (value < tree->left->key) {
                tree = LL_rotation(tree);
            } else {
                tree = LR_rotation(tree);
            }
        }
    }
    //插到右边
    else if (value > tree->key) {
        tree->right = insert(tree->right, value);
        //插入节点后,若失去平衡,则需要调整
        if (height(tree->right) - height(tree->left) == 2) {
            if (value > tree->right->key) {
                tree = RR_rotation(tree);
            } else {
                tree = RL_rotation(tree);
            }
        }
    }
    else {
        std::cout << "insert error: same key! " << std::endl;
    }

    //更新高度
    tree->height = std::max(height(tree->left), height(tree->right)) + 1;
    return tree;
}

template <typename T>
void AVLTree<T>::preOrder(Node *tree)
{
    if (tree == nullptr) return;
    std::cout << tree->key << " ";
    preOrder(tree->left);
    preOrder(tree->right);
}

template <typename T>
void AVLTree<T>::inOrder(Node *tree)
{
    if (!tree) return;
    inOrder(tree->left);
    std::cout << tree->key << " ";
    inOrder(tree->right);
}

template <typename T>
void AVLTree<T>::postOrder(Node *tree)
{
    if (!tree) return;
    postOrder(tree->left);
    postOrder(tree->right);
    std::cout << tree->key << " ";
}

//清除
template <typename T>
void AVLTree<T>::clear()
{
    destroy(rootTree);
}

template <typename T>
void AVLTree<T>::destroy(Node_pointer&tree)
{
    if (tree == nullptr) return;

    if (tree->left) destroy(tree->left);
    if (tree->right) destroy(tree->right);

    delete tree;
    tree = nullptr;

}

template <typename T>
typename AVLTree<T>::Node* AVLTree<T>::remove(Node_pointer& tree, Node* z)
{
    if (tree == nullptr || z == nullptr)
        return nullptr;

    //左子节点
    if (z->key < tree->key) {
        tree->left = remove(tree->left, z);
        //插入节点后,若失去平衡,则需要调整
        if (height(tree->left) - height(tree->right) == 2) {
            if (z->key < tree->left->key) {
                tree = LL_rotation(tree);
            }
            else {
                tree = LR_rotation(tree);
            }
        }
    }
    //右子节点
    else if(z->key > tree->key){
        tree->right = remove(tree->right, z);
        //插入节点后,若失去平衡,则需要调整
        if (height(tree->right) - height(tree->left) == 2) {
            if (z->key > tree->right->key) {
                tree = RR_rotation(tree);
            }
            else {
                tree = RL_rotation(tree);
            }
        }
    }
    //当前节点
    else {
        if ((tree->left != nullptr) && (tree->right != nullptr)) {
            if (height(tree->left) > height(tree->right)) {
                //找到左边的最大值,删除该节点
                //并替换改节点的值
                //此时AVL树还是平衡的
                Node* maxNode = max(tree->left);
                tree->key = maxNode->key;
                tree->left = remove(tree->left, maxNode);

            } else {
                //找到右边的最小值,删除该节点
                //并替换改节点的值
                //此时AVL树还是平衡的
                Node* minNode = min(tree->right);
                tree->key = minNode->key;
                tree->right = remove(tree->right, minNode);
            }
        } else {
            Node* tmp = tree;
            tree = (tree->left != nullptr) ? tree->left : tree->right;
            delete tree;
        }
    }

    return tree;
}

template <typename T>
void AVLTree<T>::remove(T value)
{
    Node* z;
    if ((z = search(rootTree, value)) != nullptr) {
        rootTree = remove(rootTree, z);
    }
}

template <typename T>
typename AVLTree<T>::Node*  AVLTree<T>::max(Node *tree)
{
    if (!tree) return nullptr;

    Node* x = tree;
    while (x->right) {
        x = x->right;
    }
    return x;
}


template <typename T>
typename AVLTree<T>::Node* AVLTree<T>::min(Node *tree)
{
    if (!tree) return nullptr;

    Node* x = tree;
    while (x->left) {
        x = x->left;
    }
    return x;
}

template <typename T>
typename AVLTree<T>::Node* AVLTree<T>::search(Node* tree, T key)
{
    if (tree == nullptr) return nullptr;

    if (tree->key == key) return tree;

    if (key < tree->key) {
        return search(tree->left, key);
    } else {
        return search(tree->right, key);
    }

}
原文地址:https://www.cnblogs.com/vczf/p/12107471.html