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
又是一道avl tree的题,好久不用纯c了,一直用c++,用纯c写一发,不画图写不出来。。。

代码:

#include <stdio.h>
#include <stdlib.h>
typedef struct tree tree;
struct tree {
int data;
tree *left,*right;
}*head = NULL;
int n,d,flag = ;
int level[];
tree *create(int data) {///创建节点
tree *t = (tree *)malloc(sizeof(tree));
t -> left = t -> right = NULL;
t -> data = data;
return t;
}
int max_(int a,int b) {///最大值
return a > b ? a : b;
}
int getheight(tree *t) {///求高度
if(t == NULL)return ;
return max_(getheight(t -> left),getheight(t -> right)) + ;
}
tree *ll(tree *t) {///左左旋
tree *temp = t -> left;
t -> left = temp -> right;
temp -> right = t;
return temp;
}
tree *rr(tree *t) {///右右旋
tree *temp = t -> right;
t -> right = temp -> left;
temp -> left = t;
return temp;
}
tree *lr(tree *t) {///左右旋
t -> left = rr(t -> left);
return ll(t);
}
tree *rl(tree *t) {///右左旋
t -> right = ll(t -> right);
return rr(t);
}
tree *insert_(tree *t,int data) {
if(t == NULL)return create(data);
else if(data > t -> data)t -> right = insert_(t -> right,data);
else t -> left = insert_(t -> left,data);
int a = getheight(t -> left),b = getheight(t -> right);
if(a - b == ) {///左边高
if(data > t -> left -> data) {///插入的结点 在左子树的右子树
t = lr(t);
}
else t = ll(t);///在左子树的左子树
}
else if(b - a == ) {
if(data < t -> right -> data) {///插入的结点 在右子树的左子树
t = rl(t);
}
else t = rr(t);///在右子树的右子树
}
return t;
}
void level_order(tree *t) {///判断是否是完全二叉树
tree *q[] = {t},*p;
int l = ,r = ;
while(l < r) {
p = q[l ++];
level[l - ] = p -> data;
if(p -> left) {
if(flag == )flag = ;///之前有空结点 那么肯定不是完全二叉树
q[r ++] = p -> left;
}
else if(flag == )flag = ;///遇到空结点
if(p -> right) {
if(flag == )flag = ;
q[r ++] = p -> right;
}
else if(flag == )flag = ;
}
}
int main() {
scanf("%d",&n);
for(int i = ;i < n;i ++) {
scanf("%d",&d);
head = insert_(head,d);
}
level_order(head);
for(int i = ;i < n;i ++) {
if(i)putchar(' ');
printf("%d",level[i]);
}
puts(flag ? "\nYES" : "\nNO");
}

1123 Is It a Complete AVL Tree(30 分)的更多相关文章

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

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

  3. PAT甲级题解-1123. Is It a Complete AVL Tree (30)-AVL树+满二叉树

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6806292.html特别不喜欢那些随便转载别人的原创文章又不给 ...

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

    AVL树的插入,旋转. #include<map> #include<set> #include<ctime> #include<cmath> #inc ...

  5. 1123 Is It a Complete AVL Tree

    1123 Is It a Complete AVL Tree(30 分) An AVL tree is a self-balancing binary search tree. In an AVL t ...

  6. PAT甲级1123. Is It a Complete AVL Tree

    PAT甲级1123. Is It a Complete AVL Tree 题意: 在AVL树中,任何节点的两个子树的高度最多有一个;如果在任何时候它们不同于一个,则重新平衡来恢复此属性.图1-4说明了 ...

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

  8. PAT 1123 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 sub ...

  9. PAT甲级1123 Is It a Complete AVL Tree【AVL树】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805351302414336 题意: 给定n个树,依次插入一棵AVL ...

随机推荐

  1. 京东2015年应届生招聘笔试题(A)卷答案选择题部分

    1.操作系统死锁的必要条件(多选题):()   A.相互排斥条件   B.系统资源有限   C.进程调度不合理   D.环路等待条件 答:A,C,D 參考资料:http://blog.sina.com ...

  2. 分布式搜索elasticsearch 环境搭建

    1.elasticsearch安装 elasticsearch的安装超级easy,解压即用(要事先安装好java环境). 到官网 http://www.elasticsearch.org下载最新版的 ...

  3. EventListener中的handleEvent

    在研究代码时发现类似这样一段代码: function TEST() {} TEST.prototype = { init:function() { window.addEventListener('m ...

  4. log4j:WARN Please initialize the log4j system properly.

    在tomcat启动的时候,出现这个警告: log4j:WARN No appenders could be found for logger (org.apache.commons.digester. ...

  5. charles 4.x 破解版安装 以及使用

    下载地址 https://pan.baidu.com/s/1dFvYM7B 破解方法 未破解的情况下,每30分钟会弹出一个提示,然后关闭软件 将压缩包内的 charles.jar 复制到安装目录下,替 ...

  6. eclipse如何debug调试jdk源码

    java是一门开源的程序设计语言,喜欢研究源码的java开发者总会忍不住debug一下jdk源码.虽然官方的jdk自带了源码包src.zip,然而在debug时查看变量却十分麻烦.例如调试HashMa ...

  7. iOS中用UIWebView的loadHTMLString后图片和文字失调解决方法

    iOS中用UIWebView的loadHTMLString后图片和文字失调,图片过大,超过屏幕,文字太小.或者图片太小.文字太大,总之就是不协调. 我们的需求是让图片的大小跟着屏幕的变化而变化.就是动 ...

  8. HashMap与 HashTable, Treemap的区别

    (一)HashMap 1.HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null; 2.HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数 ...

  9. T-SQL简单查询语句(模糊查询)

    T-SQL简单查询语句 简单查询: 1.最简单查询(查所有数据) select * from 表名: 注:* 代表所有列 select * from info 2.查询指定列 select code, ...

  10. Circling Round Treasures CodeForces - 375C

    C. Circling Round Treasures time limit per test 1 second memory limit per test 256 megabytes input s ...