1123 Is It a Complete AVL Tree(72行代码+超详细注释)

news2025/1/11 4:13:32

1123 Is It a Complete AVL Tree

分数 30

全屏浏览题目

作者 CHEN, Yue

单位 浙江大学

An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

Now given a sequence of insertions, you are supposed to output the level-order traversal sequence of the resulting AVL tree, and to tell if it is a complete binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (≤ 20). Then N distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

Output Specification:

For each test case, insert the keys one by one into an initially empty AVL tree. Then first print in a line the level-order traversal sequence of the resulting AVL tree. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line. Then in the next line, print YES if the tree is complete, or NO if not.

Sample Input 1:

5
88 70 61 63 65

Sample Output 1:

70 63 88 61 65
YES

Sample Input 2:

8
88 70 61 96 120 90 65 68

Sample Output 2:

88 65 96 61 70 90 120 68
NO

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

中间没注释的代码是二叉平衡树的基本操作见

https://blog.csdn.net/m0_66329385/article/details/130672224

#include<bits/stdc++.h>
using namespace std;
const int N=30;
int n;
int l[N],r[N],h[N],v[N],idx;//分别为左子树,右子树,高度,结点权值,当前节点 
int q[N],pos[N];//前者保存层序遍历的结点顺序,后者记录在堆中各结点的下标(用于判断是否为完全二叉树) 
void updata(int u){
    h[u]=max(h[l[u]],h[r[u]])+1;
}
void R(int &u){
    int t=l[u];
    l[u]=r[t],r[t]=u;
    updata(u),updata(t);
    u=t;
}
void L(int &u){
    int t=r[u];
    r[u]=l[t],l[t]=u;
    updata(u),updata(t);
    u=t;
}
int Balpha(int u){
    return h[l[u]]-h[r[u]];
}
void insert(int &u,int x){
    if(!u){
        u=++idx,v[u]=x;
    }
    else if(x<v[u]){
        insert(l[u],x);
        if(Balpha(u)==2){
            if(Balpha(l[u])==1)R(u);
            else L(l[u]),R(u);
        }
    }
    else{
        insert(r[u],x);
        if(Balpha(u)==-2){
            if(Balpha(r[u])==-1)L(u);
            else R(r[u]),L(u);
        }
    }
    updata(u);
}
bool bfs(int root){//模拟队列的层序遍历+判断是否为完全二叉树 
    int hh=0,tt=0;
    q[0]=root;//保存根结点 
    pos[q[0]]=1;//记录根结点在堆中的下标这里以1为例(0也可) 
    while(hh<=tt){
        int t=q[hh++];//获取当前队头元素 
        if(pos[t]>n)return false;//若在堆中的位置大于n则不是完全二叉树 
        if(l[t])q[++tt]=l[t],pos[l[t]]=pos[t]*2;//若队头元素有左子树则入队并记录当前元素在堆中的位置 
        if(r[t])q[++tt]=r[t],pos[r[t]]=pos[t]*2+1;//若队头元素有右子树则入队并记录当前元素在堆中的位置    
    }
    return true;//若堆位置从1到n都有元素,则是完全二叉树 
}
int main(){
    cin>>n;
    int root=0;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        insert(root,x);//插入结点 
    }
    bool res=bfs(root);//res作为是否为完全二叉树的标记 
    cout<<v[q[0]];//输出 
    for (int i=1;i<n;i++)cout<<' '<< v[q[i]];//输出 
    cout<<endl;
    if(res)cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/525889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【原创】ChatGPT访问及内容安全技术设计

作者&#xff1a;黑夜路人 时间&#xff1a;2023/5/15 作为爆火的AIGC产品ChatGPT&#xff0c;以及类似的产品 Cluade、Bard、Newbing 等等&#xff0c;让大家趋之若鹜&#xff0c;如何把这些产品映射到自己的业务产品中&#xff0c;也是很多开发者需要面对的问题。 针对AIGC&…

Prompt工程师指南[从基础到进阶篇]:用于开发和优化提示,以有效地使用语言模型(LMs)进行各种应用和研究主题

Prompt工程师指南[从基础到进阶篇]&#xff1a;用于开发和优化提示&#xff0c;以有效地使用语言模型&#xff08;LMs&#xff09;进行各种应用和研究主题 Prompt工程是一种相对较新的学科&#xff0c;用于开发和优化提示&#xff0c;以有效地使用语言模型&#xff08;LMs&…

基于卷积的图像分类识别(二):ZFNet

本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;MobileNet&#xff0c…

LitCTF2023 Reverse 题解及复现

文章目录 一.enbase641.main函数2.换表函数3. check函数4. 解题脚本: 二.snake1. 修复MagicNumber2. 反编译3. 解题脚本 三.For Aiur1. 注意点2. 解包3. 反编译4. 解题脚本 四.程序和人有一个能跑就行了1. fakeflag2. 真flag 五.debase641. encode函数2. 函数逻辑3. 根据程序逻…

PCIe事务层(详细)总结-PCIe专题知识(六)

目录 前言一、简介二、事务层数据传输三、数据格式四、其他相关链接1、PCIe物理层总结-PCIE专题知识&#xff08;一&#xff09;2、PCIe数据链路层图文总结-PCIe专题知识&#xff08;二&#xff09;3、PCIe物理层链路训练和初始化总结-PCIe专题知识&#xff08;三&#xff09;4…

SpringCloud:微服务保护之规则持久化

现在&#xff0c;sentinel的所有规则都是内存存储&#xff0c;重启后所有规则都会丢失。在生产环境下&#xff0c;我们必须确保这些规则的持久化&#xff0c;避免丢失。 1.规则管理模式 规则是否能持久化&#xff0c;取决于规则管理模式&#xff0c;sentinel支持三种规则管理…

基于卷积的图像分类识别(一):AlexNet

本专栏介绍基于深度学习进行图像识别的经典和前沿模型&#xff0c;将持续更新&#xff0c;包括不仅限于&#xff1a;AlexNet&#xff0c; ZFNet&#xff0c;VGG&#xff0c;GoogLeNet&#xff0c;ResNet&#xff0c;DenseNet&#xff0c;SENet&#xff0c;MobileNet&#xff0c…

机器学习中的监督学习、无监督学习、半监督学习和强化学习,这四种学习方式到底有啥区别?

监督学习、无监督学习、半监督学习和强化学习 人工智能中的机器学习是指让计算机通过学习数据的方式改善性能。在机器学习中&#xff0c;有四种主要的学习方式&#xff1a;监督学习、无监督学习、半监督学习和强化学习。本文将详细介绍这四种学习方式的概念、应用和优缺点。 …

[GXYCTF2019]BabyUpload1

上传文件后提示后缀名不能有ph 那估计都是黑名单过滤&#xff0c;大小写绕过也不行&#xff0c;尝试一下上传.htaccess文件 将文件名称为abc的当做php文件执行 上传后提示上传类型露骨&#xff0c;说明绕过了黑名单但是还有content_type类型坐镇 那就利用burp抓包修改content—…

msvcp140.dll丢失怎样修复,总结4个msvcp140.dll丢失的修复方法

今天早上打开photoshop的时候&#xff0c;电脑突然提示由于找不到msvcp140.dll&#xff0c;无法继续执行此代码&#xff0c;一时间都懵了&#xff0c;不知道怎么处理。在网上找了一上午的资料及修复方法&#xff0c;MSVCP140.dll是一个非常重要的Windows系统文件&#xff0c;它…

win10 平台搭建react native 并在 Android模拟器上运行app

目录 1 安装npm 1.1 nodejs官网下载 安装程序&#xff0c;双击安装&#xff0c;一路点“是"即可 1.2 增加三个环境变量 NODE_PATH NVM_HOME NVM_SYMLINK 1.3 在PATH中增加 %NVM_HOME% %NVM_SYMLINK% 2 安装yarn 3 安装java 11.0.2 3.1 安装…

Unity 矩阵简介

前言&#xff1a;与向量一样&#xff0c;矩阵也是3D数学的基础。要正确进行物体的位移、旋转和缩放变换&#xff0c;就必须要用到矩阵。 3D游戏中的向量一般只有3个维度&#xff0c;但矩阵要使用44矩阵&#xff0c;主要原因你是要用矩阵实现平移&#xff0c;33矩阵是不够的。4…

C++类和对象下

专栏&#xff1a;C/C 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本章为大家带来C类和对象相关内容。 类和对象下 类的默认成员函数构造函数析构函数拷贝构造函数运算符重载 const成员再谈构造函数构造函数体赋值初始值列表 explicit关键字static成员友元内部类匿名对象…

【MySQL】表的操作

目录 一.使用Cmd命令执行操作 1.使用&#xff08;mysql -uroot -p)命令进入数据库 2.创建一个角色表用于操作&#xff08;创建表之前先使用数据库&#xff09; 3.查看表 4.插入数据 5.查看表中内容 6.修改表 1.修改表名 2.修改字段名 3.修改字段的数据类型 ALTER TABL…

Vue3-黑马(十一)

目录&#xff1a; &#xff08;1&#xff09;vue3-router-布局和菜单 &#xff08;2&#xff09;vue3-进阶-router-图标二次封装-单文件组件 &#xff08;3&#xff09;vue3-进阶-router-图标的二次封装-函数式组件 &#xff08;1&#xff09;vue3-router-布局和菜单 主页做…

收藏:如何一步步成为技术领域专家

经常有人问我&#xff0c;为什么有的人工作10年仍然平台无奇&#xff0c;而有的人只用3年时间&#xff0c;就已经脱颖而出&#xff0c;成绩斐然。我说&#xff0c;是呀&#xff0c;有些参加工作多年却仍然只会复制粘贴简单业务代码&#xff0c;有些人在大学就写出Linux操作系统…

英文论文(sci)解读复现【NO.9】基于注意机制的葡萄叶片病害检测

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

(免费分享)基于微信小程序的旅游系统(带文档)

随着互联网的趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己的信息推广出去&#xff0c;最好方式就是建立自己的平台信息&#xff0c;并对其进行管理&#xff0c;随着现在智能手机的普及&#xff0c;人们对于智能手机里面的应用旅游服务软件也在不断的使用&#xff0…

vue-8:Vuex状态管理模式库 + map辅助函数简写

为什么存&#xff1a;存仓库的多组件可以数据共享 核心api this.$store 每个组件都可以获取$store this.$store.commit("同步方法名", 参数) 调用同步方法&#xff0c;修改store中的数据 this.$store.dispatch("异步方法名", 参数) 调用异步方法&#x…

分布式数据库集成解决方案

分布式数据库集成解决方案 分析访问部署扩展.1 以界面方式创建数据库&#xff08;采用DBCA&#xff09; # 背景 由于公司业务的发展&#xff0c;要求在其它三个城市设立货仓&#xff0c;处理发货业务。公司本部运行着一套用Sybase数据库的MIS系统可以实现发货&#xff0c;该系统…