自平衡二叉查找树 又称高度平衡树

title

AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。因此被命名为AVL树,以纪念发明者Georgy Adelson-Velsky和Evgenii Landis。

AVL树是一种自平衡二叉搜索树,其平衡性是通过旋转操作来实现的。AVL树的特点是任何节点的左右子树的高度差最多为1。当节点插入或删除时,如果导致某个节点的左右子树高度差超过1,就需要进行旋转操作来保持平衡。

AVL树有四种旋转操作:左旋、右旋、左右旋和右左旋。这些旋转操作会改变节点的父节点、左子节点和右子节点之间的关系,以达到平衡的效果。

AVL树的优点是在最坏情况下的查找、插入和删除操作都具有O(log n)的时间复杂度,相对于其他自平衡树(如红黑树)而言,其平衡性更为严格。

但AVL树的缺点是由于需要频繁进行旋转操作,导致其在插入和删除操作时的常数项比较大,因此在实际应用中,常常使用其他平衡树来代替AVL树。

以下是一个简单的C语言实现AVL树的代码:


#include <stdio.h>
#include <stdlib.h>

// AVL树节点结构体定义
typedef struct AVLNode {
    int data;               // 节点数据
    int height;             // 节点高度
    struct AVLNode* left;   // 左子节点
    struct AVLNode* right;  // 右子节点
} AVLNode;

// 获取节点高度
int getHeight(AVLNode* node) {
    if (node == NULL) {
        return -1;
    } else {
        return node->height;
    }
}

// 更新节点高度
void updateHeight(AVLNode* node) {
    int heightLeft = getHeight(node->left);
    int heightRight = getHeight(node->right);
    node->height = (heightLeft > heightRight ? heightLeft : heightRight) + 1;
}

// 右旋操作
AVLNode* rightRotate(AVLNode* node) {
    AVLNode* leftChild = node->left;
    node->left = leftChild->right;
    leftChild->right = node;
    updateHeight(node);
    updateHeight(leftChild);
    return leftChild;
}

// 左旋操作
AVLNode* leftRotate(AVLNode* node) {
    AVLNode* rightChild = node->right;
    node->right = rightChild->left;
    rightChild->left = node;
    updateHeight(node);
    updateHeight(rightChild);
    return rightChild;
}

// 左右旋操作
AVLNode* leftRightRotate(AVLNode* node) {
    node->left = leftRotate(node->left);
    return rightRotate(node);
}

// 右左旋操作
AVLNode* rightLeftRotate(AVLNode* node) {
    node->right = rightRotate(node->right);
    return leftRotate(node);
}

// 插入节点
AVLNode* insertNode(AVLNode* node, int data) {
    if (node == NULL) {
        // 创建新节点
        AVLNode* newNode = (AVLNode*)malloc(sizeof(AVLNode));
        newNode->data = data;
        newNode->height = 0;
        newNode->left = NULL;
        newNode->right = NULL;
        return newNode;
    } else if (data < node->data) {
        node->left = insertNode(node->left, data);
        // 检查是否需要旋转
        if (getHeight(node->left) - getHeight(node->right) == 2) {
            if (data < node->left->data) {
                node = rightRotate(node);
            } else {
                node = leftRightRotate(node);
            }
        }
    } else if (data > node->data) {
        node->right = insertNode(node->right, data);
        // 检查是否需要旋转
        if (getHeight(node->right) - getHeight(node->left) == 2) {
            if (data > node->right->data) {
                node = leftRotate(node);
            } else {
                node = rightLeftRotate(node);
            }
        }
    }
    // 更新节点高度
    updateHeight(node);
    return node;
}

// 遍历AVL树
void traverse(AVLNode* node) {
    if (node != NULL) {
        printf("%d ", node->data);
        traverse(node->left);
        traverse(node->right);
    }
}
powered by Gitbook© 2023 编外计划 | 最后修改: 2023-11-24 03:37:00

results matching ""

    No results matching ""