• 数据结构-平衡二叉树(AVL树)


    一、平衡二叉树的定义

    1. 使树的高度在每次插入元素后仍然能保持O(logn)的级别
    2. AVL仍然是一棵二叉查找树
    3. 左右子树的高度之差是平衡因子,且值不超过1
    //数据类型
    struct node{
        int v, height;
        node *lchild, *rchild;
    };
    
    //新建一个结点
    node* newNode(int v){
        node* Node = new node;
        Node->v = v;
        Node->height = 1;
        Node->lchild = Node->rchild = NULL;
        return Node;
    }
    
    //获取结点root的高度
    int getHeight(node* root){
        if(root == NULL) return 0;
        return root->height;
    }
    
    //计算平衡因子
    int getBalanceFactor(node* root){
        return getHeight(root->lchild) - getHeight(root->rchild);
    }
    
    //结点root所在子树的height等于其左子树的height与右子树的height的较大值加1
    void updateHeight(node* root){
        root->height = max(getHeight(root->lchild), getHeight(root->rchild);
    }
    

    二、平衡二叉树的基本操作

    1. 查找操作
    • 查找方法和二叉查找树一致
    void search(node* root, int x){
        if(root == NULL){
            printf("search failed
    ");
            return;
        }
        if(x == root->data){
            printf("%d
    ". root->data);
        }else if(x < root->data){
            search(root->lchild, x);
        }else{
            search(root->rchild, x);
        }
    }
    
    2. 插入操作
    • 左旋(Left Rotation)
    void L(node* &root){
        node* temp = root->rchild;
        root->rchild = temp->lchild;//步骤一
        temp->lchild = root;//步骤二
        updateHeight(root);//更新结点高度
        updateHeight(temp);
        root = temp;//步骤三
    }
    
    • 右旋(Right Rotation)
    void R(node* &root){
        node* temp = root->lchild;
        root->lchild = temp->rchild;
        temp->rchild = root;
        updateHeight(root);
        updateHeight(temp);
        root = temp;
    }
    
    • LL:对root进行右旋,BF(root)=2,BF(root->lchild)=1
    • LR:先对root->lchild进行左旋,再对root进行右旋。BF(root)=2, BF(root->lchild)=-1
    • RR:对root进行左旋BF(root)=-2, BF(root->rchild)=-1
    • RL:先对root->rchild进行右旋,再对root进行左旋,BF(root)=-2,BF(root->rchild)=1
    //不考虑平衡的二叉排序树的插入操作
    void insert(node* &root, int v){
        if(root == NULL){
            root = newNode(v);
            return;
        }
        if(v < root->v){
            insert(root->lchild, v);
        }else{
            insert(root->rchild, v);
        }
    }
    
    void insert(node* &root, int v){
        if(root == NULL){
            root = newNode(v);
            return;
        }
        if(v < root->v){
            insert(root->lchild, v);
            updateHeight(root);
            if(getBalanceFactor(root) == 2){
                if(getBalanceFactor(root->lchild) == 1){
                    R(root);
                }else if(getBalanceFactor(root->lchild) == -1){
                    L(root->lchild);
                    R(root);
                }
            }else{
                insert(root->rchild, v);
                updateHeight(root);
                if(getBalanceFactor(root) == -2){
                    if(getBalanceFactor(root-rchild) == -1){
                        L(root);
                    }else if(getBalanceFactor(root-rchild) == 1){
                        R(root->rchild);
                        L(root);
                    }
                }
            }
        }
    }
    
    3. AVL树的建立
    node* Create(int data[], int n){
        node* root = NULL;
        for(int i = 0; i < n; i++){
            insert(root, data[i]);
        }
        return root;
    }
    
    作者:睿晞
    身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
    劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
    曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    Proj THUDBFuzz Paper Reading: The Art, Science, and Engineering of Fuzzing: A Survey
    Proj THUDBFuzz Paper Reading: A systematic review of fuzzing based on machine learning techniques
    9.3 付费代理的使用
    11.1 Charles 的使用
    第十一章 APP 的爬取
    10.2 Cookies 池的搭建
    10.1 模拟登录并爬取 GitHub
    11.5 Appium 爬取微信朋友圈
    11.4 Appium 的基本使用
    11.3 mitmdump 爬取 “得到” App 电子书信息
  • 原文地址:https://www.cnblogs.com/tsruixi/p/12337630.html
Copyright © 2020-2023  润新知