AVL树 + 判断是否为完全二叉树
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int key, height;
Node *left, *right;
};
vector<int> ans;
int height(Node *node)
{
if (node == NULL) return 0;
return node->height;
}
int getBalance(Node *node)
{
if (node == NULL) return 0;
return height(node->left) - height(node->right);
}
Node *newNode(int key)
{
Node *node = (Node*)malloc(sizeof(Node));
node->key = key;
node->left = NULL;
node->right = NULL;
node->height = 1;
return node;
}
void maintain(Node *node)
{
node->height = max(height(node->left), height(node->right)) + 1;
}
Node *leftRotate(Node *x)
{
Node *y = x->right;
Node *T2 = y->left;
y->left = x;
x->right = T2;
maintain(x);
maintain(y);
return y;
}
Node *rightRotate(Node *y)
{
Node *x = y->left;
Node *T2 = x->right;
x->right = y;
y->left = T2;
maintain(y);
maintain(x);
return x;
}
Node *insert(Node *node, int key)
{
if (node == NULL) return newNode(key);
if (key < node->key) node->left = insert(node->left, key);
else if (key > node->key) node->right = insert(node->right, key);
else return node;
maintain(node);
int balance = getBalance(node);
if (balance > 1 && key < node->left->key) return rightRotate(node); // LL
if (balance < -1 && key > node->right->key) return leftRotate(node); // RR
if (balance > 1 && key > node->left->key) { //LR
node->left = leftRotate(node->left);
return rightRotate(node);
}
if (balance < -1 && key < node->right->key) { //RL
node->right = rightRotate(node->right);
return leftRotate(node);
}
return node;
}
void printGivenLevel(Node *node, int level)
{
if (node == NULL) return;
if (level == 1) ans.push_back(node->key);
else if (level > 1) {
printGivenLevel(node->left, level - 1);
printGivenLevel(node->right, level - 1);
}
}
void printLevelOrder(Node *node)
{
int h = height(node);
for (int i = 1; i <= h; i++) printGivenLevel(node, i);
}
bool isComplete(Node *root)
{
if (root == NULL) return true;
queue<Node*> q;
bool flag = false;
q.push(root);
while (!q.empty()) {
Node *now = q.front();
q.pop();
if (now->left != NULL) {
if (flag) return false;
q.push(now->left);
} else flag = true;
if (now->right != NULL) {
if (flag) return false;
q.push(now->right);
} else flag = true;
}
return true;
}
int main()
{
Node *root = NULL;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
root = insert(root, x);
}
printLevelOrder(root);
cout << ans[0];
for (int i = 1; i < ans.size(); i++) cout << ' ' << ans[i];
cout << endl;
if (isComplete(root)) cout << "YES" << endl; else cout << "NO" << endl;
return 0;
}
本文介绍了一个使用AVL树结构实现的算法,该算法不仅能够进行高效的插入操作,同时还能判断构建的树是否为完全二叉树。通过高度平衡旋转保持树的平衡,并利用队列遍历来检查树的完全性。
5281

被折叠的 条评论
为什么被折叠?



