原文鏈接:我的個人博客
原題鏈接
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;
}