爆刷PAT(甲级)——之【1123】 Is It a Complete AVL Tree (30 分)——AVL树建树+层次遍历+完全二叉树的判断

WRF移动嵌套结合伏羲模型与CFD(PALM)高精度多尺度降尺度分析研究 WRF移动嵌套(Moving Nesting):动态调整高分辨率嵌套网格位置,追踪天气系统(如台风、强对流系统)以提高局地预报精度。伏羲(Fuxi)模型:国产数值模式,提供对WRF模拟的初始及边界条件优化。CFD(Computational Fluid Dynamics)PALM模型:精细化局地流场、湍流、温度分布。 阅读详情

题意:给一个N以及序列(不用考虑元素重复情况)。然后根据这个建AVL树,输出AVL树的层序遍历,以及判断此树是否是完全二叉树。

难点:这道题没有什么思路。题目很清晰,考点就是AVL建树+层次遍历+完全二叉树的判断。自己下手的时候才意识到AVL树怎么写来着。。。就去记了一下。。。;层次遍历很简单的,就不多提了;如何判断是否是完全二叉树呢?对于完全二叉树而言,有一个节点没有孩子了,那之后的节点(层次遍历顺序上)肯定都没有孩子了!写代码的时候,别忘了,按照先左后右的顺序。而右子树里面的条件左子树里别忘了写。。。忘了就直接一个点过不了,一个点8分呀,血亏!

 

参考博客有:

     1、柳神的写法——https://blog.youkuaiyun.com/liuchuo/article/details/53561924

     2、另外两位博主,一位有图可以用来思考——https://blog.youkuaiyun.com/u014634338/article/details/42465089

          另一位有不错的代码总结表格,我也用来借鉴——https://blog.youkuaiyun.com/whucyl/article/details/17289841

 

AVL建树的思考:

1、看了柳神的代码以及别人的代码,在节点的高度计算的方面主要是分两个写法——每个节点的h是用的时候迭代算还是在AVL发生旋转更新的时候算出来并保存为节点的一个参数。

我比较喜欢简洁清晰的思维方式以及代码书写方式,但是不管哪个思路和写法都差不多。。都是迭代更新。。。

对比了一下代码量,emmm还不如直接用的时候迭代算呢。所以代码是仿照柳神的代码写的。

2、AVL树的旋转上,不管是哪种旋转,插入的位置和发生变动的根root并不是父子关系,而是爷孙关系!(高度差2!)这点比较重要,整个AVL树的旋转过程,我觉得可以理解成“新王交接,父承子业”的感觉。

举个栗子——以左旋和右旋来说,root节点是原来的老皇帝,它的儿子节点son是即将把它赶下去自己上的新皇帝,而我们插入的节点位置是新皇帝的孩子位置!而发生旋转后呢,新王变成root,而原来的旧王(旧的root)就待在原来新王的位置(它还没旋转前的位置),接受了新王原来的孩子(也就是我们插入的节点)。

   插入在root节点的左子树的左侧,就是右旋咯,我写的函数是   ll();(就是左子树的左子树)

   插入在root节点的左子树的右侧,就和这个名字一样了,先左旋再右旋咯,我写的函数是   lr();(就是左子树的右子树)

   插入在root节点的右子树的右侧,就是左旋咯,我写的函数是   rr();(就是右子树的右子树)

   插入在root节点的右子树的左侧,就是先右旋再左旋咯,我写的函数是   rl();(就是右子树的右子树) 

在写AVL建树过程中,一定要搞清楚传入的参数root是旋转变换中的哪个节点(答案:旧王~是插入节点的爷爷——爸爸的爸爸)

3、为什么大家写的AVL建树函数insert上都有一个步骤——root->left=insert(root->left)或者是root->right=nsert(root->right)呢?可以不按照这个迭代的写法,删掉这句吗?

我试了一下,并不行,这个树就建错了。

仔细想了一下,这是为什么呢?

是因为,如果我们插入了一个新的节点,没发生旋转那就万事OK,但如果新的节点会引起旋转,那也并不是在插入位置进行旋转呀!我们上面讲了,要旋转也是插入点的父亲(新王)和父亲的父亲(旧王)进行旋转呀,引入迭代一个是可以更好的进行旋转结点指针的使用指派,带来优化;另一个是新王和旧王的交替,会导致旧王的父亲(插入节点的曾爷爷)的右指针需要更改维护!好好品味一下~所以,insert中需要迭代更新的步骤,是为了使得旋转后的节点能够更新到更高层的树上,不更新这个树就断了!

 

Code:

代码的核心就是AVL怎么建树的。

以及如何判断是否是完全二叉树部分。

 

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define inf 209
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)
int n;
struct Node
{
    int value;
    Node *left,*right;
    Node(int v)
    {
        value=v;
        left=right=NULL;
    }
}*root=NULL;

//左旋和右旋的灵魂就是——新王交接,父承子业
//转一次的root,就是旧王,新王是他儿子
//转两次的root,他的儿子是转第一次的旧王,root自己是转第二次的旧王
//ll中左子无敌,rr中右子无敌
//lr中左子必死;rl中右子必死


Node* ll(Node *root)//插在左子树左边,是右旋——root是旧王,左子新王
{
    Node *son=root->left;//造反的新王
    root->left=son->right;//旧王贬官,交接
    son->right=root;//新王摸狗头
    return son;//返回新王
}
Node* rr(Node *root)//插在右子树右边,是左旋——root是旧王,右子新王
{
    //同上噢
    Node *son=root->right;
    root->right=son->left;
    son->left=root;
    return son;
}

//插在左子树的右边,是先左旋再右旋
//则root为旧王,但是root的左子却是左旋的旧王
Node* lr(Node *root)
{
    root->left=rr(root->left);//先左旋
    return ll(root);//再右旋

}

//插在右子树的左边,是先右旋再左旋
//则root为旧王,但是root的右子却是右旋的旧王
Node *rl(Node *root)
{
    root->right=ll(root->right);
    return rr(root);
}

//1、因为AVL树在插入过程中会进行旋转,
//所以对于任何root而言,其左右子树都可能发生旋转,并使得root的左右孩子更改
//所以要左右孩子要保持迭代更新
//2、旋转过程中,判断是否发生旋转,就是在高度差为2的root和root的孩子上,要求高
//综上所述要按照递归写法
int getH(Node *root)//得到节点高
{
    if(!root)return 0;
    int l=getH(root->left);
    int r=getH(root->right);
    return max(l,r)+1;
}
Node* insert(Node *root,int value)
{
    if(!root)root=new Node(value);
    else if(value<root->value)//左边
    {
        root->left=insert(root->left,value);//防止孩子旋转,物是人非
        if(getH(root->left)-getH(root->right)==2)//因为插在左子树,所以要旋转也是左子树变长了
        {
            if(value<root->left->value)//在左子树的左子树上,是ll
                root=ll(root);//新的王
            else
                root=lr(root);
        }

    }
    else //右边
    {
        root->right=insert(root->right,value);//防止孩子旋转,物是人非
        if(getH(root->right)-getH(root->left)==2)//因为插在右子树,所以要旋转也是右子树变长了
        {
            if(value>root->right->value)//在右子树的右子树上,是rr
                root=rr(root);//新的王
            else
                root=rl(root);
        }

    }
    return root;
}

//vector<int>ans;
bool isComplete(Node *root)
{
    queue<Node*>q;
    while(!q.empty())q.pop();
    q.push(root);
    bool flag1=true;
    bool flag2=true;
    int num=0;
    while(!q.empty())
    {
        Node *t=q.front();
        q.pop();
        //输出
        num++;
        if(num==n)printf("%d\n",t->value);
        else printf("%d ",t->value);

        if(t->left)
        {
            q.push(t->left);
            if(!flag1)flag2=false;//不要漏了
        }
        else flag1=false;
        if(t->right)
        {
            q.push(t->right);
            if(!flag1)flag2=false;//不要漏了
        }
        else flag1=false;
    }
    return flag2;
}

int main()
{
    int i,j;
    cin>>n;
    loop(i,0,n)
    {
        cin>>j;
        root=insert(root,j);
    }
    if(isComplete(root))
        printf("YES\n");
    else printf("NO\n");

    return 0;
}

 

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios) 公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。 阅读详情

相关推荐

从0到1做AI漫剧:即梦+豆包+剪映+红果全流程实战

AI视频生成正在重塑内容创作的生产方式,它让原本高门槛的影视制作,变成了一条由文本、画面、剪辑与分发环节协同的流水线。理解其底层原理,在于将大模型的语义理解、图像生成与视频合成能力,与工程化的流程管理相结合,从而实现从创意到成片的自动化输出。这种技术的价值,不仅体现在降低制作成本,更在于让个人创作者能够独立完成高质量短剧,并快速迭代内容。在短剧、短视频、广告营销等场景中,利用即梦生成画面、豆包编写剧本、剪映完成剪辑、红果进行分发的组合,已成为一种被广泛验证的实践路径。本文聚焦AI漫剧制作,从环境准备、分镜设

weixin_34072637的博客 380

(PAT)1123.[平衡树旋转] Is It a Complete AVL Tree

PAT最后一题还是挺看运气的,考满分的确不容易(菜鸡的感叹!!!) 这是一道关于平衡二叉树旋转的问题,可以说非常基础,题目也没啥特别的变化,但奈何徒手码不粗来,大写的尴尬啊。 1123. Is It a Complete AVL Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16

路漫漫 始于足下 1010

Unity 数字孪生实战:PiXYZ Plugin工业模型高效处理指南

本文是Unity数字孪生实战指南,重点介绍了如何使用PiXYZ Plugin高效处理工业CAD模型。针对工业模型导入Unity时面临的格式壁垒、数据爆炸和资产混乱等核心痛点,文章提供了从环境安装、基础导入到智能减面、资产清理的完整解决方案,并分享了预设自动化、运行时导入等高级技巧与性能优化策略,帮助开发者快速打通工业设计与实时交互流程。

weixin_29009501的博客 255

【PAT甲级 - C++题解】1123 Is It a Complete AVL Tree

📣专栏定位:为想考甲级PAT的小伙伴整理常考算法题解,祝大家都能取得满分!

Newin2020的博客 540

《AI应用架构师必学:企业AI能力地图构建的高级技巧》

企业AI能力地图,简单来说,是一种可视化工具,它展示了企业在AI领域所具备的各种能力及其相互关系。就如同城市地图展示城市的街道、建筑和设施一样,AI能力地图呈现了企业在数据处理、模型开发、算法应用等多个方面的能力布局。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 819

OpenClaw 聪明设置指南(真实可用方案)

本文介绍了OpenClaw AI系统的配置与优化指南,主要内容包括:1)基础配置,涵盖初始化流程、安全设置和配置文件位置;2)模型分层策略,推荐主力模型与降级方案;3)性能优化,包括推理加速和内存管理;4)智能提升方法,如人格定义和技能安装;5)高级功能如多Agent协同和Token优化。文章提供了详细的配置命令和参数说明,帮助用户根据需求平衡性能与成本,实现高效AI助手部署。

qq_43344878的博客 709

【PAT甲级真题整理五】1121~1155

终于考完了qaq把最后一堆也整理出来了 目录 1121 Damn Single(25)set、map的使用 1122 Hamiltonian Cycle(25)哈密顿回路 1123 Is It a Complete AVL Tree(30)AVL树+bfs 1124 Raffle for Weibo Followers(20)set的使用 1125 Chain the Ropes(2...

よろしくお願いします 1681

antiSMASH安装与使用

antiSMASH本地安装 简要: antiSMASH的本地安装需要安装很多的依赖包,本文章使用conda辅助安装 参考: 官方:https://docs.antismash.secondarymetabolites.org/install/ 文章:http://blog.sciencenet.cn/blog-3416913-1240614.html 依赖包下载 conda install -y diamond=0.8.36 conda install -y fasttree=2.1.9 conda ins

Curry_chenhu的博客 7224

个人练习-PAT甲级-1123 Is It a Complete AVL Tree

题目链接https://pintia.cn/problem-sets/994805342720868352/problems/994805351302414336 题目大意:给出N个数字,建AVL树。然后输出层序遍历。最后判断是否是完全二叉树。 正常的左旋右旋左右旋右左旋代码书上都有,不赘述了。层序遍历用个queue就行。在层序遍历时判断是否是完全二叉树,我们给每个结点加一个属性pos,根的pos==1,那么左儿子的pos等于父亲的2倍,右儿子的pos等于父亲的两倍+1。如果一棵树是完全二叉树,那么其pos

Rstln的博客 870

智能电网中的智能调度与优化算法研究

本文研究智能电网中的智能调度与优化算法,旨在提高电网运行的效率与可靠性,减少能源浪费和设备故障的风险。在智能电网日益复杂化的背景下,传统的调度方法已难以满足高效、稳定的运行要求,因此亟需借助先进的优化算法对电网进行智能调度。本文第一深入分析智能电网调度中的关键问题与挑战,探讨优化算法在智能电网中的应用现状,并分析常见的优化算法,如遗传算法、粒子群算法和模拟退火算法。随后,本文构建智能电网的调度优化数学模型,并对电网负荷、发电模型及约束条件进行详细建模。在算法部分,本文提出改进的粒子群算法和遗传算法,并结合M

weixin_44553616的博客 1889

PPT高清导出秘籍:如何轻松设置600dpi图片分辨率

本文详细解析了PPT导出图片模糊的根本原因,并提供了通过修改Windows注册表将导出分辨率从默认的96dpi提升至600dpi的完整教程。该方法能显著提升图片清晰度,满足学术出版与高质量印刷需求,文中还包含效果对比、进阶设置及常见问题解答。

a0b1c2d3的专栏 1315

1123. Is It a Complete AVL Tree (30)-PAT甲级真题

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...

柳婼 の blog 5455

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

2026年广东省职业院校技能大赛中职组“大数据应用与服务”样题一完整参考答案

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 740

PAT-A1123 Is It a Complete AVL Tree 题目内容及题解

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...

BourbonWhiskey 的博客 567

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

1123 Is It a Complete AVL Tree (30 分)--PAT甲级

1123 Is It a Complete AVL Tree (30 分) 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 d...

laplacebh的博客 669

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

PAT 甲级 1123  Is It a Complete AVL Tree

1123 Is It a Complete AVL Tree (30 point(s)) 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 tim...

漫浸天空的雨色的备忘录~ 700

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

pat甲级1123Is It a Complete AVL Tree (30分)

pat甲级1123Is It a Complete AVL Tree (30分) 模板题;代码较长,半小时敲完。。。。。。打字太慢 文章目录pat甲级1123Is It a Complete AVL Tree (30分)1.AVL插入结点模板2.层序遍历模板3.主函数 1.AVL插入结点模板 struct node { int data,height=1; node *lchild=NULL,*rchild=NULL; node(int _data) {data=_data;} }

qq_44992782的博客 178

PAT 甲级 1123 Is It a Complete AVL Tree (30 分) AVL+层次遍历

感动!从没看过AVL的代码,自己通过对四种平衡方式的理解,然后把代码写出来了 题意: 创建一颗AVL树,输出层次遍历序列,并判断是不是完全二叉树 思路: 本题难点就是AVL建树过程; 结构体存树的结点,包含值,左孩子高度,右孩子高度;左孩子,右孩子指针。 一共有四种平衡方式,详见概念以及代码 详细的讲解:https://blog.youkuaiyun.com/xiang_6/arti...

床前明月光 233

PAT甲级——1123 Is It a Complete AVL Tree (完全AVL树的判断)

1123Is It a Complete AVL Tree(30分) 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 ...

小熊猫的博客 362

PAT(A) 1123. Is It a Complete AVL Tree (30)

原题目: 原题链接:https://www.patest.cn/contests/pat-a-practise/1123 1123. Is It a Complete AVL Tree (30) An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the...

萧易桥的博客 384

PAT A1123 Is It a Complete AVL Tree (30分) (AVL树 和 CBT判定)

PAT甲级:A1123 Is It a Complete AVL Tree (30分) 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 ...

只想用最简短的代码刷题 441

PAT甲级1123 Is It a Complete AVL Tree完全AVL树

在AVL树的基础上增加了层次遍历,对于是否时完全二叉树的判别,采用方法是当读到某个结点的左孩子或者右孩子为空的时候退出循环,如果不为空,则递增cnt,最后判断cnt是否等于n,如果等于表明已经全部读完,是完全二叉树 #include<iostream> #include<vector> #include<algorithm> #include<queue> using namespace std; struct node{ int data,heig.

Artorias的博客 234

PAT甲级A1123 Is It a Complete AVL Tree (30 分)

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...

vir_lee的博客 195

1123 Is It a Complete AVL Tree (30point(s)) - C语言 PAT 甲级

* 建树直接上 AVL 代码 * 层序遍历用队列遍历 * 判断完全二叉树 * 若一个节点没有孩子节点,则这个节点后的所有节点也没有孩子节点,即为完全二叉树 * 否则不是完全二叉树

有三只土豆 747

PAT甲级 1123 Is It a Complete AVL Tree (30分) AVL树+层序/C++

1123 Is It a Complete AVL Tree (30分) 判断是否为完全平衡二叉树(满足完全二叉树+二叉搜索树+平衡树) 题目大意:给定一个序列,按顺序插入到空树中,输出层序遍历结果,以及是否为完全二叉树(YES/NO) 如果不太懂AVL树,以及旋转规则等,可以去中国大学mooc上看看浙江大学的《数据结构》课程( 传送门0 ),在第四讲(树(中))。老师讲得很好,也有代码实现,这里就不赘述啦~ 判断是否为完全二叉树,我采用的是层序遍历,这样就可以一边输出一边判断( 和甲级的另外一题

qq_43955154的博客 260

PAT甲级1123 Is It a Complete AVL Tree (30 分)

1123Is It a Complete AVL Tree(30分) 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 ...

Dexter 257
上一篇: 爆刷PAT(甲级)——之【1153】 Decode Registration Card of PAT (25 分)——模拟细节题(如何解决超时问题!)
下一篇: 【算法模板】AVL树建树模板(没有删除操作)
仰天倀笑
博客等级 码龄10年 313粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值