AVL平衡搜索树

这篇博客介绍了AVL树的基本概念和性质,包括平衡因子和插入节点后的旋转操作,如左单旋转、右单旋转、左右旋转和右左旋转。通过示例代码展示了AVL树节点的定义以及插入、查找、中序遍历和判断平衡的方法。

AVL树又称高度平衡的二叉搜索树

性质:
     1. 左子树和右子树的高度之差的绝对值不超过1
     2. 树中的每个左子树和右子树都是AVL树
     3. 每个节点都有一个平衡因子(balance factor--bf),任一节点的平衡因子是-1,0,1。(每个节点的平衡因子等于右子树的高度减去左子树的高度 )

     当插入一个节点时,如果这个节点的父节点的平衡因子不满足AVL树的特点,这时就需要对AVL树进行调整,即旋转。

     1、左单旋转
     
2、右单旋转
        
3、左右旋转

4、右左旋转

实现代码如下:
#pragma once

template<class K,class V>
struct AVLTreeNode
{
    AVLTreeNode<K,V>* _left;
    AVLTreeNode<K,V>* _right;
    AVLTreeNode<K,V>* _parent;

    K _key;
    V _value;

    int _bf;//平衡因子
    AVLTreeNode(const K& key,const V& value)
        :_bf(0)
        ,_left(NULL)
        ,_right(NULL)
        ,_parent(NULL)
        ,_key(key)
        ,_value(value)
    { }
};

template<class K,class V>
class AVLTree
{
public:
    typedef AVLTreeNode<K,V> Node;
    AVLTree()
        :_root(NULL)
    { }

    bool Insert(const K& key,V& value)
    {
        if(_root == NULL)
        {
            _root = new Node(key,value);
            return true;
        }

        Node* cur = _root;
        Node* parent = NULL;

        while (cur)
        {
            if(cur->_key < key)
            {
                parent = cur;
                cur = cur->_right;
            }
            else if(cur->_key > key)
            {
                parent = cur;
                cur = cur->_left;
            }
            else
            {
                return false;
            }
        }

        cur = new Node(key,value);
        if(parent->_key < key)
        {
            parent->_right = cur;
            cur->_parent = parent;
        }
        else
        {
            parent->_left = cur;
            cur->_parent = parent;
        }

        //检查树是否平衡
        //更新平衡因子,不满足条件时,进行旋转
        while (parent)
        {
            if(cur == parent->_left)
                parent->_bf--;
            else
                parent->_bf++;
            if(parent->_bf == 0)
                break;
            else if(parent->_bf == -1 || parent->_bf == 1)//回朔
            {
                cur = parent;
                parent = cur->_parent;
            }
            else//平衡因子为2或-2
            {
                if(cur->_bf == 1)
                {
                    if(parent->_bf == 2)
                        RotateL(parent);
                    else//-2
                        RotateLR(parent);
                }
                else
                {
                    if(parent->_bf == -2)
                        RotateR(parent);
                    else
                        RotateRL(parent);
                }
                break;
            }
        }
        return true;
    }

    Node* Find(const K& key)
    {
        if(_root == NULL)
            return NULL;
        Node* cur = _root;
        while (cur)
        {
            if(cur->_key < key)
            {
                cur = cur->_right;
            }
            else if(cur->_key > key)
            {
                cur = cur->_left;
            }
            else
            {
                return cur;
            }
        }
        return NULL;
    }

    void InOrder()
    {
        _InOrder(_root);
        cout<<endl;
    }

    bool IsBlance()
    {
        return _IsBlance(_root);
    }


    ~AVLTree()
    {
        _Destroy(_root);
        _root = NULL;
    }

protected:
    void RotateL(Node* parent)
    {
        Node* subR = parent->_right;
        Node* subRL = subR->_left;

        parent->_right = subRL;
        if(subRL)
            subRL->_parent = parent;

        subR->_left = parent;

        Node* ppNode = parent->_parent;
        parent->_parent = subR;
        subR->_parent = ppNode;
        if(ppNode == NULL)
        {
            _root = subR;
        }
        else
        {
            if(ppNode->_left == parent)
                ppNode->_left = subR;
            else
                ppNode->_right = subR;
        }
        parent->_bf = subR->_bf = 0;
    }

    void RotateR(Node* parent)
    {
        Node* subL = parent->_left;
        Node* subLR = subL->_right;
        parent->_left = subLR;
        if(subLR)
            subLR->_parent = parent;
        subL->_right = parent;
        Node* ppNode = parent->_parent;
        parent->_parent = subL;
        subL->_parent = ppNode;

        if(ppNode == NULL)
        {
            _root = subL;
        }
        else
        {
            if(ppNode->_left == parent)
                ppNode->_left = subL;
            else
                ppNode->_right = subL;
        }
        parent->_bf = subL->_bf = 0;
    }

    void RotateLR(Node* parent)
    {
        Node* subL = parent->_left;
        Node* subLR =subL->_right;
        int bf = subLR->_bf;

        RotateL(parent->_left);
        RotateR(parent);

        //根据subL的平衡因子修正其他节点的平衡因子
        if(bf == -1)
        {
            subL->_bf = 0;
            parent->_bf = 1;
        }
        else if(bf == 1)
        {
            subL->_bf = -1;
            parent->_bf = 0;
        }
        else
        {
            subL->_bf = parent->_bf = 0;
        }
    }

    void RotateRL(Node* parent)
    {
        Node* subR = parent->_right;
        Node* subRL = subR->_left;
        int bf = subRL->_bf;
        RotateR(parent->_right);
        RotateL(parent);

        //根据subRL的平衡因子修正其它节点的平衡因子
        if(bf == 1)
        {
            subR->_bf = 0;
            parent->_bf = -1;
        }
        else if(bf == -1)
        {
            subR->_bf = 1;
            parent->_bf = 0;
        }
        else
        {
            parent->_bf = subR->_bf = 0;
        }
    }

    void _Destroy(Node* root)
    {
        if(root == NULL)
            return;
        _Destroy(root->_left);
        _Destroy(root->_right);
        delete root;
    }

    void _InOrder(Node* root)
    {
        if(root == NULL)
            return;
        _InOrder(root->_left);
        cout<<root->_key<<" ";
        _InOrder(root->_right);
    }

    int _Height(Node* root)
    {
        if(root == NULL)
            return 0;
        int Left = _Height(root->_left);
        int Right = _Height(root->_right);
        return (Left > Right) ? (Left + 1) : (Right + 1);
    }

    bool _IsBlance(Node* root)
    {
        if(root == NULL)
            return true;
        int left = _Height(root->_left);
        int right = _Height(root->_right);
        if((right - left) != root->_bf || abs(right - left) > 1)
        {
            cout<<"该节点的平衡因子异常:";
            cout<<root->_key<<" "<<endl;
            return false;
        }
        return _IsBlance(root->_left) && _IsBlance(root->_right);
    }

protected:
    Node* _root;
};

void AVLTreeTest()
{
    int a[] = {16, 3, 7, 11, 9, 26, 18, 14, 15};
    AVLTree<int,int> tree;
    for(int i = 0;i < 9;i++)
    {
        tree.Insert(a[i],i);
    }
    tree.InOrder();
    tree.Find(16);
    tree.IsBlance();

}

void TestTree_SP()
{
    int a[] = {4, 2, 6, 1, 3, 5, 15, 7, 16, 14};
    AVLTree<int, int> t;

    for (int i = 0; i < sizeof(a)/sizeof(a[0]); ++i)
    {
        t.Insert(a[i], i);
    }
    t.InOrder();
    t.IsBlance();
}


【SCI复现】基于纳什博弈的多微网主体电热双层共享策略研究(Matlab代码实现)内容概要:本文围绕“基于纳什博弈的多微网主体电热双层共享策略研究”展开,结合Matlab代码实现,复现了SCI级别的科研成果。研究聚焦于多个微网主体之间的能源共享问题,引入纳什博弈理论构建双层优化模型,上层为各微网间的非合作博弈策略,下层为各微网内部电热联合优化调度,实现能源高效利用与经济性目标的平衡。文中详细阐述了模型构建、博弈均衡求解、约束处理及算法实现过程,并通过Matlab编程进行仿真验证,展示了多微网在电热耦合条件下的运行特性和共享效益。; 适合人群:具备一定电力系统、优化理论和博弈论基础知识的研究生、科研人员及从事能源互联网、微电网优化等相关领域的工程师。; 使用场景及目标:① 学习如何将纳什博弈应用于多主体能源系统优化;② 掌握双层优化模型的建模与求解方法;③ 复现SCI论文中的仿真案例,提升科研实践能力;④ 为微电网集群协同调度、能源共享机制设计提供技术参考。; 阅读建议:建议读者结合Matlab代码逐行理解模型实现细节,重点关注博弈均衡的求解过程与双层结构的迭代逻辑,同时可尝试修改参数或扩展模型以适应不同应用场景,深化对多主体协同优化机制的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值