美文网首页
AVL树的调整相关算法

AVL树的调整相关算法

作者: qratosone | 来源:发表于2016-04-01 01:58 被阅读0次

AVL树的左旋与右旋等操作


LL旋转:

导致失衡的是节点node的左子树的左孩子,称为LL

Paste_Image.png

调整算法如下:
对于节点node,首先取其左孩子为临时节点temp
令temp的右孩子成为node的左孩子
令node成为temp的右孩子
更新高度
返回temp作为初始节点(位置相当于原来node所在位置)

LR旋转:

导致失衡的是节点node的左子树的右孩子,称为LR

Paste_Image.png

调整算法如下:
取节点node的左孩子为temp
首先对temp进行一次RR调整
然后对node进行一次LL调整

RR和RL调整与LL和LR调整完全对称,将对应算法中的所有左右全部颠倒即可


建立AVL树的代码:

#include <iostream>
#include<algorithm>
using namespace std;
class Node {
public:
    Node* left;
    Node* right;
    int data;
    int height;
    Node(int v):data(v),left(NULL),right(NULL),height(0){}
};
int getHeight(Node* node){
    if (node==NULL)
    {
        return -1;
    }
    return node->height;
}
bool isBalanced(Node* node) {
    int balanced = getHeight(node->left) - getHeight(node->right);
    return abs(balanced) < 2;
}
Node* rotate_LL(Node* node) {
    Node* temp = node->left;
    node->left = temp->right;
    temp->right = node;
    //更新两者的高度
    node->height = max(getHeight(node->left), getHeight(node->right)) + 1;
    temp->height = max(getHeight(temp->left), getHeight(temp->right)) + 1;
    return temp;
}
Node* rotate_RR(Node* node) {
    Node* temp = node->right;
    node->right = temp->left;
    temp->left = node;
    node->height = max(getHeight(node->left), getHeight(node->right)) + 1;
    temp->height = max(getHeight(node->left), getHeight(node->right)) + 1;
    return temp;
}
Node* rotate_LR(Node* node) {
    Node* temp = node->left;
    node->left = rotate_RR(temp);
    return rotate_LL(node);
}
Node* rotate_RL(Node* node) {
    Node* temp = node->right;
    node->right = rotate_LL(temp);
    return rotate_RR(node);
}
Node* insert(Node* root, int value) {
    if (root==NULL)
    {
        root =new Node(value);
    }
    else
    {
        if (root->data<value)//R
        {
            root->right = insert(root->right, value);
            if (!isBalanced(root))
            {
                if (root->right->data < value) { //RR
                    root = rotate_RR(root);
                }
                else//RL
                {
                    root = rotate_RL(root);
                }
            }
        }
        else
        {
            root->left = insert(root->left, value);//L
            if (!isBalanced(root)) {
                if (root->left->data>value)//LL
                {
                    root = rotate_LL(root);
                }
                else
                {   //LR
                    root = rotate_LR(root);
                }
            }
        }
    }
    root->height = max(getHeight(root->left), getHeight(root->right)) + 1;//更新root的高度
    return root;
}
void PrintTree(Node* root)
{
    if (root != NULL)
    {
        cout << root->data << "--";
        PrintTree(root->left);
        PrintTree(root->right);
    }
    
}
int main() {
    int N;
    cin >> N;
    Node* root = NULL;
    int input;
    for (int i = 0; i < N; i++)
    {
        cin >> input;
        root = insert(root, input);
//      PrintTree(root);
    }
    int output = root->data;
    cout << output << endl;
    return 0;
}

相关文章

  • AVL树的调整相关算法

    AVL树的左旋与右旋等操作 LL旋转: 导致失衡的是节点node的左子树的左孩子,称为LL 调整算法如下:对于节点...

  • 数据结构与算法-AVL 红黑树

    AVL树AVL树 算法红黑树红黑树 B站

  • 二叉平衡树(AVL树)

    平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一...

  • 每周算法-AVL树

    文章首发个人博客 shimeng.info 背景 之前学习过二叉搜索树BST,顺序的插入数据的时候BST被退化为链...

  • 8. 红黑树与AVL树,各自的优缺点总结

    RB-Tree和AVL树作为BBST,其实现的算法时间复杂度相同,AVL作为最先提出的BBST,貌似RB-tree...

  • 7.红黑树和AVL树比较优缺点

    RB-Tree和AVL树作为BBST,其实现的算法时间复杂度相同,AVL作为最先提出的BBST,貌似RB-tree...

  • python面试笔记

    知识点: 红黑树和AVL树 floyd算法(延申:动态规划+贪心算法) 修饰器 生成器 朴素匹配法和kmp匹配法 ...

  • 数据结构与算法系列(AVL树)

    AVL树 AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写。AVL树属于树的一种,而且它也是一棵二叉搜索树,...

  • AVL平衡二叉搜索树(Java)

    转载自彻底搞懂AVL树 什么是AVL树 AVL树,是一种平衡(balanced)的二叉搜索树(binary sea...

  • 11-AVL树

    AVL树 AVL树是最早发明的自平衡二叉搜索树之一, AVL取名于两位发明者的名字,有人把AVL树叶念做“艾薇儿树...

网友评论

      本文标题:AVL树的调整相关算法

      本文链接:https://www.haomeiwen.com/subject/wafylttx.html