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, orNO
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树和层序遍历两个知识点~~判断是不是完全二叉树,就看在当前队列中,任一结点出现了一个孩子为空的结点之后是否还会出现孩子结点不为空的结点,如果出现了就不是完全二叉树。
#include<bits/stdc++.h>
using namespace std;
struct node {
node *left,*right;
int val;
};
node* LeftRotate(node *root) {
node *tmp=root->right;
root->right=tmp->left;
tmp->left=root;
return tmp;
}
node* RightRotate(node *root) {
node *tmp=root->left;
root->left=tmp->right;
tmp->right=root;
return tmp;
}
node* LeftRightRotate(node *root) {
root->left=LeftRotate(root->left);
return RightRotate(root);
}
node* RightLeftRotate(node *root) {
root->right=RightRotate(root->right);
return LeftRotate(root);
}
int getHeight(node *root) {
if(root==NULL) return 0;
int l=getHeight(root->left);
int r=getHeight(root->right);
return max(l,r)+1;
}
node* Insert(node *root,int val) {
if(root==NULL) {
root=new node();
root->val=val;
} else if(val<root->val) {
root->left=Insert(root->left,val);
int l=getHeight(root->left);
int r=getHeight(root->right);
if(l-r>=2) {
if(val<root->left->val) root=RightRotate(root);
else root=LeftRightRotate(root);
}
} else {
root->right=Insert(root->right,val);
int l=getHeight(root->left);
int r=getHeight(root->right);
if(r-l>=2) {
if(val>root->right->val) root=LeftRotate(root);
else root=RightLeftRotate(root);
}
}
return root;
}
void LevelOrder(node *root) {
int isComplete=1,haveChild=1;
queue<node*> q;
q.push(root);
node *tmp;
while(!q.empty()) {
int sum=q.size();
for(int i=0; i<sum; i++) {
tmp=q.front();
q.pop();
if(tmp->left!=NULL) {
if(haveChild==0) isComplete=0;
q.push(tmp->left);
} else haveChild=0;
if(tmp->right!=NULL) {
if(haveChild==0) isComplete=0;
q.push(tmp->right);
} else haveChild=0;
if(tmp->val==root->val) printf("%d",root->val);
else printf(" %d",tmp->val);
}
}
cout<<endl;
if(isComplete) cout<<"YES\n";
else cout<<"NO\n";
}
int main() {
int n,p;
cin>>n;
node *root=NULL;
for(int i=0; i<n; i++) {
scanf("%d",&p);
root=Insert(root,p);
}
LevelOrder(root);
return 0;
}