https://www.patest.cn/contests/pat-a-practise/1123
参考了:http://www.liuchuo.net/archives/2732
#include <cstdio>
#include <queue>
using namespace std;
typedef struct node {
int v;
struct node * left, *right;
node(int x) :left(NULL), right(NULL) {
v = x;
}
}Node;
int getHeight(Node * root) {
if (root == NULL) return 0;
int l = getHeight(root->left);
int r = getHeight(root->right);
return (l < r ? r : l) + 1;
}
void rightRotate(Node * & root) {
Node * temp = root->left;
root->left = temp->right;
temp->right = root;
root = temp;
return;
}
void leftRotate(Node * & root) {
Node * temp = root->right;
root->right = temp->left;
temp->left = root;
root = temp;
return;
}
void leftRightRotate(Node * & root) {
leftRotate(root->left);
rightRotate(root);
}
void rightLeftRotate(Node * & root) {
rightRotate(root->right);
leftRotate(root);
}
void insert(Node *& root, int x) {
if (root == NULL) {
root = new Node(x);
return;
}
if (x <= root->v) {
insert(root->left,x);
int l = getHeight(root->left);
int r = getHeight(root->right);
if (l - r >= 2) {
if (x <= root->left->v) {
rightRotate(root);
}
else {
leftRightRotate(root);
}
}
}
else {
insert(root->right, x);
int l = getHeight(root->left);
int r = getHeight(root->right);
if (r - l >= 2) {
if ( x > root->right->v) {
leftRotate(root);
}
else {
rightLeftRotate(root);
}
}
}
}
bool levelOrder(Node * root, vector<int> & v) {
if (root == NULL) return true;
bool isComplete = true;
queue<Node*> q;
q.push(root);
bool noChild = false;
while (!q.empty()) {
Node * node = q.front();
//printf("q: %d ",node->v);
q.pop();
v.push_back(node->v);
if (node->left != NULL) {
if (noChild) {
isComplete = false;
}
q.push(node->left);
}
else {
noChild = true;
}
if (node->right != NULL) {
if (noChild) {
isComplete = false;
}
q.push(node->right);
}
else {
noChild = true;
}
}
return isComplete;
}
int main()
{
int n,a;
scanf("%d", &n);
Node * root =NULL;
for (int i = 0; i < n; i++)
{
scanf("%d", &a);
insert(root, a);
}
vector<int> v;
bool isComplete = levelOrder(root,v);
int vSize = v.size();
for (int i = 0; i < vSize; i++)
{
if (i == 0) printf("%d", v[i]);
else printf(" %d", v[i]);
}
printf("\n%s\n", isComplete ? "YES":"NO");
return 0;
}