首先要知道完全二叉树,AVL树的定义。这个题看似复杂,但是分解为每一个小问题还是不难的。判断完全二叉树的方法就是,用after记录若某个节点的左子树为NULL时置为1,若还有节点push进来那就代表不是完全二叉树。
#include<bits/stdc++.h>
using namespace std;
struct node {
int val;
struct node *lc, *rc;
};
node* leftRotate (node *tree) {
node *temp = tree->rc;
tree->rc = temp->lc;
temp->lc = tree;
return temp;
}
node* rightRotate (node *tree) {
node *temp = tree->lc;
tree->lc = temp->rc;
temp->rc = tree;
return temp;
}
node* leftRightRotate (node *tree) {
tree->lc = leftRotate (tree->lc);
return rightRotate (tree);
}
node* rightLeftRotate (node *tree) {
tree->rc = rightRotate (tree->rc);
return leftRotate (tree);
}
int getHeight (node *tree) {
if (tree == NULL) return 0;
int l = getHeight (tree->lc);
int r = getHeight (tree->rc);
return max(l, r) + 1;
}
node *insert(node *tree, int val) {
if (tree == NULL) {
tree = new node();
tree->val = val;
}
else if (tree->val > val) {
tree->lc = insert(tree->lc, val);
int l = getHeight(tree->lc), r = getHeight(tree->rc);
if (l - r >= 2) {
if (val < tree->lc->val)
tree = rightRotate(tree);
else
tree = leftRightRotate(tree);
}
}
else {
tree->rc = insert(tree->rc, val);
int l = getHeight(tree->lc), r = getHeight(tree->rc);
if (r - l >= 2) {
if (val > tree->rc->val)
tree = leftRotate (tree);
else
tree = rightLeftRotate (tree);
}
}
return tree;
}
int isComplete = 1, after = 0; //如果左子树为NULL,仍然还有节点进入队列那就不是
vector<int> levelOrder (node *tree) {
vector<int> v;
queue<node*> queue;
queue.push(tree);
while (!queue.empty()) {
node *temp = queue.front();
queue.pop();
v.push_back(temp->val);
if (temp->lc != NULL) {
if (after) isComplete = 0;
queue.push(temp->lc);
}
else {
after = 1;
}
if (temp->rc != NULL) {
if (after) isComplete = 0;
queue.push(temp->rc);
}
else {
after = 1;
}
}
return v;
}
int main() {
int n, temp;
scanf ("%d", &n);
node *tree = NULL;
for (int i = 0; i < n; i++) {
scanf ("%d", &temp);
tree = insert(tree, temp);
}
vector<int> v = levelOrder(tree);
for (int i = 0; i < v.size(); i++) {
if (i != 0) printf (" ");
printf ("%d", v[i]);
}
printf ("\n%s", isComplete ? "YES" : "NO");
return 0;
}