pat 1123. Is It a Complete AVL Tree (30)

来源:互联网 发布:java线程之间的通信 编辑:程序博客网 时间:2024/05/21 14:48

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


0 0