1616.判断完全平衡二叉树

2024-03-02 15:20

本文主要是介绍1616.判断完全平衡二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

输入格式
第一行包含整数 N,表示插入序列中元素个数。第二行包含 N个不同的整数表示插入序列。

输出格式
第一行输出得到的AVL树的层序遍历序列。第二行,如果该AVL树是完全二叉树,则输出 YES,否则输出 NO。

数据范围
1≤N≤20

输入样例1:
5
88 70 61 63 65

输出样例1:
70 63 88 61 65
YES

输入样例2:
8
88 70 61 96 120 90 65 68

输出样例2:
88 65 96 61 70 90 120 68
NO

#include<iostream>
using namespace std;
const int N=25;
int l[N],r[N],h[N],v[N],idx; //左子树、右子树、树高、权值、第几个点
int n,root;
int q[N],hh,tt;//队列
int maxk,maxid;//判断完全二叉树
int hight(int u)
{return h[l[u]]-h[r[u]];
}
void update(int u)
{h[u]=max(h[l[u]],h[r[u]])+1;
}
void R(int &u)
{int p=l[u];l[u]=r[p],r[p]=u;update(u),update(p);u=p;
}
void L(int &u)
{int p=r[u];r[u]=l[p],l[p]=u;update(u),update(p);u=p;
}
void insert(int &u,int w) //插入函数
{if(!u) u=++idx,v[u]=w;else if(w<v[u]) //插入到左子树{insert(l[u],w);if(hight(u)==2) {if(hight(l[u])==1) R(u); //LL型,右旋else L(l[u]),R(u); //LR型,先左旋再右旋}}else{insert(r[u],w);if(hight(u)==-2){if(hight(r[u])==-1) L(u); //RR型,左旋else R(r[u]),L(u);}}update(u);
}
void BFS(int u)//层序遍历
{q[hh++]=u;while(tt<hh){int k=q[tt++];if(l[k]) q[hh++]=l[k];if(r[k]) q[hh++]=r[k];cout<<v[k]<<" ";}
}
void check(int u,int k)
{if(!u) return;if(k>maxk){maxk=k;maxid=u;}check(l[u],2*k);check(r[u],2*k+1);
}
int main()
{cin>>n;for(int i=0;i<n;i++){int w;cin>>w;insert(root,w);}BFS(root); //层序遍历check(root,1); //判断是否为完全二叉树if(maxk==n) cout<<endl<<"YES";else cout<<endl<<"NO";return 0;
}

这篇关于1616.判断完全平衡二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/766570

相关文章

Python中判断对象是否为空的方法

《Python中判断对象是否为空的方法》在Python开发中,判断对象是否为“空”是高频操作,但看似简单的需求却暗藏玄机,从None到空容器,从零值到自定义对象的“假值”状态,不同场景下的“空”需要精... 目录一、python中的“空”值体系二、精准判定方法对比三、常见误区解析四、进阶处理技巧五、性能优化

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

JavaScript中的Map用法完全指南

《JavaScript中的Map用法完全指南》:本文主要介绍JavaScript中Map用法的相关资料,通过实例讲解了Map的创建、常用方法和迭代方式,还探讨了Map与对象的区别,并通过一个例子展... 目录引言1. 创建 Map2. Map 和对象的对比3. Map 的常用方法3.1 set(key, v

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python判断for循环最后一次的6种方法

《Python判断for循环最后一次的6种方法》在Python中,通常我们不会直接判断for循环是否正在执行最后一次迭代,因为Python的for循环是基于可迭代对象的,它不知道也不关心迭代的内部状态... 目录1.使用enuhttp://www.chinasem.cnmerate()和len()来判断for

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;