AVL树模版学习

对应学习PAT 1066 Root of AVL Tree (25 分) 以及 1123 Is It a Complete AVL Tree (30 分)

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;

struct Node
{
    int val;
    int height;
    Node* left;
    Node* right;
    Node()
    {
        height = 1;
        left = NULL;
        right = NULL;
    }
    //更新高度
    void UpdateHeight()
    {
        int leftheight = left ? left->height : 0;
        int rightheight = right ? right->height : 0;
        height = max(leftheight,rightheight)+1;
    }
    //左右子孩子高度差
    int DisHeight()
    {
        int leftheight = left ? left->height : 0;
        int rightheight = right ? right->height : 0;
        return leftheight-rightheight;
    }
};

Node* LL(Node* anode)
{
    Node* bnode = anode->left;
    Node* cnode = bnode->right;
    bnode->right = anode;
    anode->left = cnode;
    //更新高度时,anode一定要先更新
    anode->UpdateHeight();
    bnode->UpdateHeight();
    return bnode;
}

Node* RR(Node* anode)
{
    Node* bnode = anode->right;
    Node* cnode = bnode->left;
    bnode->left = anode;
    anode->right = cnode;
    anode->UpdateHeight();
    bnode->UpdateHeight();
    return bnode;
}

Node* LR(Node* anode)
{
    anode->left = RR(anode->left);
    return LL(anode);
}

Node* RL(Node* anode)
{
    anode->right = LL(anode->right);
    return RR(anode);
}

Node* Insert(Node* node,int val)
{
    if(node == NULL)
    {
        node = new Node();
        node->val = val;
    }
    else if(val > node->val)
    {
        node->right = Insert(node->right,val);
        int disH = node->DisHeight();
        if(disH == -2)
        {
            if(val > node->right->val) node = RR(node);
            else node = RL(node);
        }
    }
    else if(val < node->val)
    {
        node->left = Insert(node->left,val);
        int disH = node->DisHeight();
        if(disH == 2)
        {
            if(val < node->left->val) node = LL(node);
            else node = LR(node);
        }
    }
    node->UpdateHeight();
    return node;
}

Node* Delete(Node* node,int val)
{
    if(node == NULL){return NULL;}
    else if(node->val < val)
    {
        node->right = Delete(node->right,val);
    }
    else if(node->val > val)
    {
        node->left = Delete(node->left,val);
    }
    else
    {
        if(node->left)
        {
            Node* nd;
            for(nd=node->left;nd->right != NULL;nd = nd->right);
            node->val = nd->val;
            node->left = Delete(node->left,nd->val);
        }
        else if(node->right)
        {
            Node* nd;
            for(nd=node->right;nd->left != NULL;nd = nd->left);
            node->val = nd->val;
            node->right = Delete(node->right,nd->val);
        }
        else
        {
            delete node;
            return NULL;
        }
    }

    if(node->DisHeight()==2)
    {
        if(node->left->DisHeight()==1)
            node = LL(node);
        else node = LR(node);
    }
    else if(node->DisHeight()==-2)
    {
        if(node->right->DisHeight()==-1)
            node = RR(node);
        else node = RL(node);
    }

    node->UpdateHeight();
    return node;
}

void pre_travel(Node* node)
{
    if(node==NULL) return;
    printf("%d ",node->val);
    pre_travel(node->left);
    pre_travel(node->right);
}
void in_travel(Node* node)
{
    if(node==NULL) return;
    in_travel(node->left);
    printf("%d ",node->val);
    in_travel(node->right);
}

int n;
int test = 0;
int flag = 0;
vector<Node*>v;
void level_travel(Node* node){
    queue<Node*>q;
    q.push(node);
    while(!q.empty()){
        Node* temp = q.front();
        q.pop();
        v.push_back(temp);
        test++;
        if(temp->left)
            q.push(temp->left);
        if(temp->right)
            q.push(temp->right);
        if(n%2 == 0){
            if(test<n/2){
                if(temp->left && temp->right)
                    continue;
                else
                    flag = 1;
            }
            else if(test == n/2){
                if(temp->left)
                    continue;
                else
                    flag = 1;
            }
        }
        else{
            if(test<=n/2){
                if(temp->left && temp->right)
                    continue;
                else
                    flag = 1;
            }
        }
    }
}


int main()
{
    Node *root = NULL;
    cin >> n;
    for(int i=0; i<n; i++){
        int a;
        cin >> a;
        root = Insert(root,a);
    }
//    cout << root->val << endl;

    level_travel(root);
    for(int i=0; i<v.size(); i++){
        if(i==0)
            cout << v[i]->val;
        else
            cout << " " << v[i]->val;
    }
    cout << endl;
    if(flag)
        cout << "NO\n";
    else
        cout << "YES\n";
    return 0;
}
内容概要:本文围绕“基于交流潮流的电力系统多元件N-k故障模型研究”展开,深入探讨了利用Matlab代码实现电力系统在发生多个关键元件同时故障(即N-k故障)情况下的交流潮流计算与故障分析方法。该模型不仅考虑了传统潮流方程的非线性特性,还引入了故障约束条件,能够精确模拟复杂多样的故障场景,如短路、断线等,进而评估电网在极端运行条件下的稳态与动态行为。研究通过构建典型电力系统算例,验证了所提模型在故障筛选、脆弱性识别及系统恢复策略制定方面的有效性,为电力系统安全评估、风险预警和防御体系构建提供了坚实的理论依据和技术支撑。此外,模型具备良好的扩展性,可进一步应用于连锁故障传播分析、恶意攻击模拟等高级安全分析领域。; 适合人群:具备电力系统分析基础理论知识和Matlab编程能力的高校研究生、科研院所研究人员以及电力公司从事电网规划、运行与安全管理的技术人员,特别适用于开展电力系统安全稳定、可靠性评估与应急响应机制研究的专业人士。; 使用场景及目标:①开展电力系统在多重故障条件下的交流潮流仿真,评估系统电压稳定性、线路过载风险及负荷损失程度;②识别电网中的关键薄弱环节与脆弱元件,支撑电网加固改造与防御资源配置;③用于科研项目中的故障场景建模与算法验证,或作为教学案例帮助学生理解复杂故障下的系统响应机制。; 阅读建议:此资源以Matlab代码为核心实现手段,建议读者结合理论推导与代码实现进行对照学习,重点关注故障建模过程中雅可比矩阵的修正方法、故障注入方式及收敛性处理策略,建议在仿真中逐步增加故障数量与复杂度,深入理解N-k故障对系统潮流分布的影响规律,并尝试将其拓展至含新能源接入的现代电力系统场景中进行验证与优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值