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& ...
随机推荐
- Quartus设计FIR滤波器的系数文件格式(适用于FIR II的IP核)
对常用的FIR,我们使用MATLAB的fdatool(或者filterDesigner) 设计滤波器,给定指标,生成系数.为了方便,我们将系数保存到文件,其保存格式比较简介,在此进行说明. 1.FIR ...
- 加傲腾内存的电脑PE无法识别本地磁盘解决办法(M.2接口??)
---恢复内容开始--- PE一直无法识别本地硬盘一直以为是主板设置的事情!原来是新兴的接口(M.2固态具体我不大明白)的事情,需要磁盘驱动,因为PE是精简的大多数不带驱动,但是2018年的新更新的P ...
- C语言中可变参数的原理——printf()函数
函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: 使用过C语言的人所再熟悉不过 ...
- 在windows7 64位上安装selenium2library问题解决
今天发现了windows7 64位上安装selenium2Libaray的问题,下载exe文件安装不行.就切换成了半自动模式. 方案如下: 1.首先下载pip安装.(因为要用pip来安装 selen ...
- code first网站发布后数据表中没有数据问题
code first网站发布后数据表中没有数据问题 (1).将internal sealed class Configuration类访问修饰符改为public class Configuratio ...
- 前端解析返回的对象时json显示$ref问题的解决
在mapper中写的语句,结果集中association,采用的一个对象,整个list列表中每个元素有一个对象元素,如果第二个元素中有一个与第一个元素中对象同名的,就会去引用上一个元素的地址,在jso ...
- 工具类css框架
@charset "UTF-8"; * { -webkit-box-sizing: border-box; box-sizing: border-box; ...
- mybatis update set 多个字段
<update id="updateCustomer" parameterType="com.entrym.domain.Customer"> UP ...
- Ubuntu14.04 无法关机 SpamAssassin speech-dispatcher
在ubuntu14.04上安装完一些包后,关闭计算机就会出现关于标题中的两个错误. 1.在软件中心卸载spamAssassin 2.运行命令: sudo update-rc.d -f speech-d ...
- POJ 3311 Hie with the Pie 最短路+状压DP
Hie with the Pie Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 11243 Accepted: 5963 ...