PAT Advanced 1123 Is It a Complete AVL Tree (30) [AVL树]
题目
An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node difer by at most one; if at any time they difer 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
题目分析
已知平衡二叉树的建树序列,求二叉平衡树的层序序列,并判断是否是完全二叉树
解题思路
- 平衡二叉树建树(左右旋)
- 判断是否是二叉树
思路1:记录每个节点的index,根节点index=i,左子节点index=2i+1,右子节点index=2i+2。判断最后一个节点的index==n-1,相等即为完全二叉树
思路2:出现过NULL值后,若不再出现非NULL节点,即为完全二叉树
Code
Code 01
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct node {
int data;
int heigh=0;
int index=-1;
node * left=NULL;
node * right=NULL;
node() {}
node(int _data):data(_data) {
heigh=1;
}
};
int getHeigh(node * root) {
if(root==NULL)return 0;
else return root->heigh;
}
int getBalanceFactor(node * root) {
return getHeigh(root->left)-getHeigh(root->right);
}
void updateHeigh(node * root) {
root->heigh=max(getHeigh(root->left),getHeigh(root->right))+1;
}
void L(node * &root) {
node * temp=root->right;
root->right=temp->left;
temp->left = root;
updateHeigh(root);
updateHeigh(temp);
root=temp;
}
void R(node * &root) {
node * temp=root->left;
root->left=temp->right;
temp->right=root;
updateHeigh(root);
updateHeigh(temp);
root = temp;
}
void insert(node * &root, int val) {
if(root==NULL) {
root=new node(val);
return;
}
if(val<root->data) {
insert(root->left,val);
updateHeigh(root);
if(getBalanceFactor(root)==2) {
if(getBalanceFactor(root->left)==1) {
R(root);
} else if (getBalanceFactor(root->left)==-1) {
L(root->left);
R(root);
}
}
} else {
insert(root->right,val);
updateHeigh(root);
if(getBalanceFactor(root)==-2) {
if(getBalanceFactor(root->right)==-1) {
L(root);
} else if (getBalanceFactor(root->right)==1) {
R(root->right);
L(root);
}
}
}
}
vector<node*>nds;
/*
思路一:使用index判断是否完全二叉树
*/
//void levelOrder(node * root){
// queue<node*> q;
// root->index = 0;
// q.push(root);
// while(!q.empty()){
// node * now = q.front();
// q.pop();
// nds.push_back(now);
// if(now->left!=NULL){
// now->left->index=now->index*2+1;
// q.push(now->left);
// }
// if(now->right!=NULL){
// now->right->index=now->index*2+2;
// q.push(now->right);
// }
// }
//}
/*
思路二:出现NULL后不再出现非NULL节点即为完全二叉树
*/
int isComplete = 1, after = 0;
void levelOrder(node *tree) {
queue<node *> queue;
queue.push(tree);
while (!queue.empty()) {
node *temp = queue.front();
queue.pop();
nds.push_back(temp);
if (temp->left != NULL) {
if (after) isComplete = 0;
queue.push(temp->left);
} else {
after = 1;
}
if (temp->right != NULL) {
if (after) isComplete = 0;
queue.push(temp->right);
} else {
after = 1;
}
}
}
bool cmp(node * &n1,node * &n2) {
return n1->index<n2->index;
}
int main(int argc,char * argv[]) {
int n,m;
scanf("%d",&n);
node * root=NULL;
for(int i=0; i<n; i++) {
scanf("%d",&m);
insert(root,m);
}
levelOrder(root);
for(int i=0; i<nds.size(); i++) {
printf("%d",nds[i]->data);
if(i!=nds.size()-1)printf(" ");
else printf("\n");
}
// 思路一:使用index判断是否完全二叉树
// if(nds[n-1]->index==n-1) printf("YES");
// else printf("NO");
// 思路二:出现NULL后不再出现非NULL节点即为完全二叉树
if(isComplete) printf("YES");
else printf("NO");
return 0;
}
PAT Advanced 1123 Is It a Complete AVL Tree (30) [AVL树]的更多相关文章
- PAT甲级题解-1123. Is It a Complete AVL Tree (30)-AVL树+满二叉树
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6806292.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT (Advanced Level) 1099. Build A Binary Search Tree (30)
预处理每个节点左子树有多少个点. 然后确定值得时候递归下去就可以了. #include<cstdio> #include<cstring> #include<cmath& ...
- PAT甲级1123. Is It a Complete AVL Tree
PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...
- PAT甲级——1123 Is It a Complete AVL Tree (完全AVL树的判断)
嫌排版乱的话可以移步我的CSDN:https://blog.csdn.net/weixin_44385565/article/details/89390802 An AVL tree is a sel ...
- 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 sub ...
- PAT甲级1123 Is It a Complete AVL Tree【AVL树】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805351302414336 题意: 给定n个树,依次插入一棵AVL ...
- PAT 1123. Is It a Complete AVL Tree (30)
AVL树的插入,旋转. #include<map> #include<set> #include<ctime> #include<cmath> #inc ...
- PAT甲级题解-1066. Root of AVL Tree (25)-AVL树模板题
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6803291.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- PAT (Advanced Level) 1115. Counting Nodes in a BST (30)
简单题.统计一下即可. #include<cstdio> #include<cstring> #include<cmath> #include<vector& ...
随机推荐
- 抓包工具fiddler的Https证书设置
一.工具(option)--设置(setting)-- https-- 动作(actions)-- (open windows certificate manger)-- 搜索(fiddler)删除所 ...
- C语言里面和时间有关的函数
参考链接 https://blog.csdn.net/ffcjjhv/article/details/83376767 0)Head file #include "time.h" ...
- MongoDB 初始化数据同步
MongoDB初始化数据同步: 副本集中的成员启动之后,就会检查自身的状态,确定是否可以从某个成员那里进行同步.如果不行的话,尝试从其他成员那里进行完整的数据复制. 这个过程就是初始化同步(initi ...
- Mysql自动备份与还原 转
Mysql自动备份与还原 一.自动备份:将以下代码保存为*.bat批处理脚本,然后再添加Windows定时作业,如每天凌晨2点执行:set s=%date:~0,4%%date:~5,2%%date: ...
- 开源DDD设计模式框架YMNNetCoreFrameWork第二篇-增加swagger,数据库迁移,增加权限模型
1.框架去掉application层,把HOst作为application层 2.增加swagger插件 3.增加Asp.net Identity身份验证 源代码地址:https://github. ...
- 微信小程序添加背景图片的坑
给微信小程序页面加载背景图片解决方案 直接附上原文地址: 给微信小程序页面加载背景图片解决方案 - YUSIR 完美CODING世界 - CSDN博客 https://blog.csdn.net/y ...
- ServletContext 详解
ServletContext——它是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而servletContext ...
- Flink 历史服务与连接器
History Server(历史服务) Flink提供了记录历史任务运行情况的服务,可用于在关闭Flink群集后依然能够查询已完成作业的相关信息. 配置: # 任务执行信息存储在hdfs目录 job ...
- spring boot 开发环境搭建(Eclipse)
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- CVE-2010-0249(极光)分析报告
2019/9/10 报告doc在文件里面 1. 发现可疑流量 A.分析流量,导出字节流 B.得到网页代码,发现需要执行的代码需要解密(加密的字符串部分太长了,就省略了): C. ...