PAT A1123 Is It A Complete AVL Tree

PAT A1123 建立一颗平衡二叉树并判断其是否是完全二叉树~

#include<cstdio>
#include<algorithm>
#include<queue> 
#include<vector>
using namespace std;
struct node {
    int v;
    int height;
    node * left;
    node * right;
}; 
node * newNode (int v) {
    node * Node=new node;
    Node->v=v;
    Node->height=1;
    Node->left=NULL;
    Node->right=NULL;
    return Node;
}
int getHeight (node * root) {
    if (root==NULL) return 0;
    return root->height;
}
void update (node * &root) {
    root->height=max(getHeight(root->left),getHeight(root->right))+1;
}
int getBalance (node * root) {
    return getHeight(root->left)-getHeight(root->right);
}
void L (node * &root) {
    node * temp=root->right;
    root->right=temp->left;
    temp->left=root;
    update(root);
    update(temp);
    root=temp;
}
void R (node * &root) {
    node * temp=root->left;
    root->left=temp->right;
    temp->right=root;
    update(root);
    update(temp);
    root=temp;
}
void insert (node * &root,int x) {
    if (root==NULL) {
        root=newNode(x);
        return;
    }
    if (x<root->v) {
        insert (root->left,x);
        update(root);
        if (getBalance(root)==2) {
            if (getBalance(root->left)==1) 
            R(root);
            else if (getBalance(root->left)==-1) {
                L(root->left);
                R(root);
            }
        }
     }
     else {
         insert (root->right,x);
         update(root);
         if (getBalance(root)==-2) {
             if (getBalance(root->right)==-1) 
             L(root);
             else if (getBalance(root->right)==1) {
                 R(root->right);
                 L(root);
             }
         }
     }
}
int num=0,N;
vector<int> vi;
int flag=0,cnt=0;
void BFS (node * root) {
    queue<node *> q;
    q.push(root);
    while (!q.empty()) {
        node * now=q.front();
        q.pop();
        vi.push_back(now->v);
        if (!(!now->left&&!now->right)&&cnt==1) 
        flag=1;
        if (!now->left&&now->right) 
        flag=1;
        if ((now->left&&!now->right)||(!now->left&&!now->right)) 
        cnt++;
        if (now->left) q.push(now->left);
        if (now->right) q.push(now->right);
    }
}
int main () {
    int N;
    scanf ("%d",&N);
    int x;
    node * root=NULL;
    for (int i=0;i<N;i++) {
        scanf ("%d",&x);
        insert (root,x);
    }
    BFS (root);
    for (int i=0;i<vi.size();i++) {
        printf ("%d",vi[i]);
        if (i<vi.size()-1) printf (" ");
    }
    printf ("\n");
    if (flag==1) printf ("NO");
    else printf ("YES");
    return 0;
}

 

posted @ 2020-02-17 12:02  zlc0405  阅读(104)  评论(0编辑  收藏  举报