原文链接:我的个人博客
原题链接
1123 Is It a Complete AVL Tree (30分)
考点
AVL树、层次遍历
思路
这个题目难度还是比较大的。在此之前你应该明白如何对AVL进行旋转的调整,请查看我的这篇文章:平衡二叉搜索树AVL及其c++实现,当然写的不是很详细。如果你从未接触过,还是自行百度。
具体的解题步骤
1. 构造AVL树,涉及到LL型RR型RL型LR型的调整。
2. 利用队列进行层次遍历
3. 层次遍历时当出现过左子树或右子树为空的情况下,之后又出现存在左子树或右子树不为空的情况,即不是完全二叉树
代码
思路和代码来自柳神博客
#include <bits/stdc++.h>
using namespace std;
struct node{
int val;
struct node *left,*right;
};
vector<int>ans;
int after = 0,isC=1;
//左旋
node* leftRotate(node *tree){
node *tmp = tree->right;
tree->right = tmp->left;
tmp->left = tree;
return tmp;
}
//右旋
node* rightRotate(node *tree){
node *tmp = tree->left;
tree->left = tmp->right;
tmp->right = tree;
return tmp;
}
//先左旋再右旋
node* LR(node *tree){
tree->left = leftRotate(tree->left);
return rightRotate(tree);
}
//先右旋再左旋
node* RL(node *tree){
tree->right = rightRotate(tree->right);
return leftRotate(tree);
}
//求以tree为根节点的树高
int getHeight(node *tree){
if(tree == NULL) return 0;
int l = getHeight(tree->left);
int r = getHeight(tree->right);
return max(l,r)+1;
}
//插入val
node* insert(node *tree,int val){
if(tree ==NULL){
tree = new node();
tree->val = val;
}else if(tree->val > val){
tree->left = insert(tree->left,val);
int l = getHeight(tree->left),r=getHeight(tree->right);
if(abs(l-r)>=2){
if(val<tree->left->val){//在tree左子树的左子树上插入导致不平衡
tree = rightRotate(tree);
}else{
tree = LR(tree);
}
}
}else{
tree->right = insert(tree->right,val);
int l = getHeight(tree->left),r=getHeight(tree->right);
if(abs(l-r)>=2){
if(val>tree->right->val){//在tree左子树的左子树上插入导致不平衡
tree = leftRotate(tree);
}else{
tree = RL(tree);
}
}
}
return tree;
}
void levelOrder(node *tree){
queue<node*> q;
q.push(tree);
while(!q.empty()){
node *tmp = q.front();
q.pop();
ans.push_back(tmp->val);
if(tmp->left){
if(after) isC = 0;//在此之前出现过
q.push(tmp->left);
}else{
after = 1;
}
if(tmp->right){
if(after) isC =0;
q.push(tmp->right);
}else{
after = 1;
}
}
}
int main(){
int n,temp;
cin>>n;
node *root = NULL;
for(int i=0;i<n;i++){
cin>>temp;
root = insert(root,temp);//建树
}
levelOrder(root);
for(int i=0;i<ans.size();i++){
cout<<ans[i];
if(i!=ans.size()-1) cout<<" ";
}
printf("\n%s",isC?"YES":"NO");
return 0;
}