对应学习PAT 1066 Root of AVL Tree (25 分) 以及 1123 Is It a Complete AVL Tree (30 分)
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
struct Node
{
int val;
int height;
Node* left;
Node* right;
Node()
{
height = 1;
left = NULL;
right = NULL;
}
//更新高度
void UpdateHeight()
{
int leftheight = left ? left->height : 0;
int rightheight = right ? right->height : 0;
height = max(leftheight,rightheight)+1;
}
//左右子孩子高度差
int DisHeight()
{
int leftheight = left ? left->height : 0;
int rightheight = right ? right->height : 0;
return leftheight-rightheight;
}
};
Node* LL(Node* anode)
{
Node* bnode = anode->left;
Node* cnode = bnode->right;
bnode->right = anode;
anode->left = cnode;
//更新高度时,anode一定要先更新
anode->UpdateHeight();
bnode->UpdateHeight();
return bnode;
}
Node* RR(Node* anode)
{
Node* bnode = anode->right;
Node* cnode = bnode->left;
bnode->left = anode;
anode->right = cnode;
anode->UpdateHeight();
bnode->UpdateHeight();
return bnode;
}
Node* LR(Node* anode)
{
anode->left = RR(anode->left);
return LL(anode);
}
Node* RL(Node* anode)
{
anode->right = LL(anode->right);
return RR(anode);
}
Node* Insert(Node* node,int val)
{
if(node == NULL)
{
node = new Node();
node->val = val;
}
else if(val > node->val)
{
node->right = Insert(node->right,val);
int disH = node->DisHeight();
if(disH == -2)
{
if(val > node->right->val) node = RR(node);
else node = RL(node);
}
}
else if(val < node->val)
{
node->left = Insert(node->left,val);
int disH = node->DisHeight();
if(disH == 2)
{
if(val < node->left->val) node = LL(node);
else node = LR(node);
}
}
node->UpdateHeight();
return node;
}
Node* Delete(Node* node,int val)
{
if(node == NULL){return NULL;}
else if(node->val < val)
{
node->right = Delete(node->right,val);
}
else if(node->val > val)
{
node->left = Delete(node->left,val);
}
else
{
if(node->left)
{
Node* nd;
for(nd=node->left;nd->right != NULL;nd = nd->right);
node->val = nd->val;
node->left = Delete(node->left,nd->val);
}
else if(node->right)
{
Node* nd;
for(nd=node->right;nd->left != NULL;nd = nd->left);
node->val = nd->val;
node->right = Delete(node->right,nd->val);
}
else
{
delete node;
return NULL;
}
}
if(node->DisHeight()==2)
{
if(node->left->DisHeight()==1)
node = LL(node);
else node = LR(node);
}
else if(node->DisHeight()==-2)
{
if(node->right->DisHeight()==-1)
node = RR(node);
else node = RL(node);
}
node->UpdateHeight();
return node;
}
void pre_travel(Node* node)
{
if(node==NULL) return;
printf("%d ",node->val);
pre_travel(node->left);
pre_travel(node->right);
}
void in_travel(Node* node)
{
if(node==NULL) return;
in_travel(node->left);
printf("%d ",node->val);
in_travel(node->right);
}
int n;
int test = 0;
int flag = 0;
vector<Node*>v;
void level_travel(Node* node){
queue<Node*>q;
q.push(node);
while(!q.empty()){
Node* temp = q.front();
q.pop();
v.push_back(temp);
test++;
if(temp->left)
q.push(temp->left);
if(temp->right)
q.push(temp->right);
if(n%2 == 0){
if(test<n/2){
if(temp->left && temp->right)
continue;
else
flag = 1;
}
else if(test == n/2){
if(temp->left)
continue;
else
flag = 1;
}
}
else{
if(test<=n/2){
if(temp->left && temp->right)
continue;
else
flag = 1;
}
}
}
}
int main()
{
Node *root = NULL;
cin >> n;
for(int i=0; i<n; i++){
int a;
cin >> a;
root = Insert(root,a);
}
// cout << root->val << endl;
level_travel(root);
for(int i=0; i<v.size(); i++){
if(i==0)
cout << v[i]->val;
else
cout << " " << v[i]->val;
}
cout << endl;
if(flag)
cout << "NO\n";
else
cout << "YES\n";
return 0;
}