PAT1123 Is It a Complete AVL Tree (30分)

原文鏈接:我的個人博客

原題鏈接

  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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章