sicily AVLTree

本文介绍了一种构造AVL树的方法,并实现了相应的插入和平衡调整操作。通过递归方式完成节点插入,同时利用左旋、右旋等操作保持树的平衡特性。最后展示了如何进行前序遍历。
Description

给出结点的插入序列,构造AVL Tree。 
 
      

Input

第一行含一个整数t(0<t<10),为测试样例个数。
每个测试样例包含两行;第1行为一个整数n,表示插入的结点数;第2行依照插入顺序给出n个结点的数值(整数),之间用一个空格分隔。

Output

对每个测试样例单独一行输出对应AVL Tree的前序遍历序列,每输出一个结点的数值(包括最后一个结点),其后输出一个空格。 


我写之前借鉴了其他博客和课本上的代码。最终觉得课本上的写法不好,太复杂,转而模仿了其他博客中的写法

#include <iostream>
using namespace std;
struct avlNode {
    int data, height;
    avlNode* left, *right;
    avlNode(const int d, avlNode* l = NULL,
        avlNode* r = NULL) : data(d), left(l), right(r) {}
};
int get_height(avlNode* p) {
    if (p != NULL) return p->height;
    else return 0;
}
inline int max(const int a,const int b) {
    return a > b ? a: b;
}
avlNode* left_rotation(avlNode* p) {
    avlNode* right_tree = p->right;
    p->right = right_tree->left;
    right_tree->left = p;
    p->height = max(get_height(p->left), get_height(p->right)) +1;
    right_tree->height = max(get_height(right_tree->left), get_height(right_tree->left)) +1;
    return right_tree;
}
avlNode* right_rotation(avlNode* p) {
    avlNode* left_tree = p->left;
    p->left = left_tree->right;
    left_tree->right = p;
    p->height = max(get_height(p->left), get_height(p->right)) + 1;
    left_tree->height = max(get_height(left_tree->left), get_height(left_tree->right)) + 1;
    return left_tree;
}
avlNode* RL_rotation(avlNode* p) {
    p->right = right_rotation(p->right);
    return left_rotation(p);
}
avlNode* LR_rotation(avlNode* p) {
    p->left = left_rotation(p->left);
    return right_rotation(p);
}
void insert(avlNode* &p,int key) {
    if (p == NULL) {
        p = new avlNode(key);
    } else if (key > p->data) {
        insert(p->right, key);
        if (get_height(p->right) - get_height(p->left) == 2) {
            if (key > (p->right)->data) p = left_rotation(p);
            else if (key < (p->right)->data) p = RL_rotation(p);
        }
    } else if (key < p->data) {
        insert(p->left, key);
        if (get_height(p->left) - get_height(p->right) == 2) {
            if (key < (p->left)->data) p = right_rotation(p);
            else if (key > (p->left)->data) p = LR_rotation(p);
        }
    }
    p->height = max(get_height(p->left), get_height(p->right)) + 1;
}
void preorder(avlNode* p) {
    if (p != NULL) {
        cout << p->data + 1 << " ";
        preorder(p->left);
        preorder(p->right);
    }
}
int main() {
    int t, n, i, temp;
    avlNode* root = NULL;
    cin >> t;
    while (t--) {
        cin >> n;
        for (i = 0; i < n; i++) {
            insert(root, i);
        }
    }
    preorder(root);
}



内容概要:本文档为集成系统平台通用验收方案的经典模板,系统阐述了项目验收的全过程,涵盖验收前提、标准、初步验收、上线试运行及最终验收等关键环节。重点包括验收准备、文档整理、售后服务交接、技术文档移交、上线切换与运行维护、问题处理机制以及项目总结与验收评审等内容,确保系统在功能、性能、稳定性等方面满足合同和技术要求,并实现平稳过渡与长期稳定运行。文档强调交付物完整性、多方协作及后续支持机制,保障项目顺利收尾并进入质保期。; 适合人群:从事系统集成、软件实施、项目管理及相关技术支持工作的专业人员,尤其是参与政府或企业信息化建设项目的技术负责人、项目经理、运维人员及验收评审人员。; 使用场景及目标:①用于指导大型信息系统建设项目在部署后的验收流程设计与执行;②帮助项目团队规范交付文档、理清验收步骤、落实售后服务衔接;③支撑甲乙双方依据合同和标准完成上线试运行、初步验收和最终验收,确保项目合规闭环。; 阅读建议:此模板具有较强的实务性和可操作性,使用者应结合具体项目背景进行裁剪和补充,重点关注验收标准、文档清单和服务交接机制,在实际应用中同步完善问题台账、运维手册和培训记录,提升项目交付质量与客户满意度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值