PAT 1123. Is It a Complete AVL Tree (30) (AVL的插入旋轉以及完全二叉樹的判斷)

傳送門

題意:

    給你n個點的序列,讓你建一個平衡二叉樹,並判斷這個平衡二叉樹是否是完全二叉樹,並輸出其層次遍歷.

思路:

    AVL樹的插入旋轉見: 點擊

    完全二叉樹的判斷:繼續點擊

此題不過是二者的結合罷了.

#include<bits/stdc++.h>

using namespace std;
struct node
{
    int val;
    node *l;
    node *r;
    node()
    {
        l = r = nullptr;
    }
};
int get_height(node *root)
{
    if(root == nullptr)
        return 0;
    return max(get_height(root -> l),get_height(root -> r)) + 1;
}
node *LL(node *root)
{
    node * tmp;
    tmp = root -> l;
    root -> l = tmp -> r;
    tmp -> r = root;
    return tmp;
}
node *RR(node *root)
{
    node *tmp ;
    tmp = root -> r;
    root -> r = tmp -> l;
    tmp -> l = root;
    return tmp;
}
node *LR(node *root)
{
    root -> l = RR(root -> l);
    return LL(root);
}
node *RL(node *root)
{
    root -> r = LL(root -> r);
    return RR(root);
}
node *Fix(node *root)
{
    int lh = get_height(root -> l);
    int rh = get_height(root -> r);
    if(lh > rh)
    {
        if(get_height(root -> l -> l) > get_height(root -> l -> r))
            root = LL(root);
        else
            root = LR(root);
    }
    else
    {
        if(get_height(root -> r -> l) > get_height(root -> r -> r))
            root = RL(root);
        else
            root = RR(root);
    }
    return root;
}
node *Insert(node *root,int val)
{
    if(root == nullptr)
    {
        node *tmp = new node;
        tmp -> val = val;
        return tmp;
    }
    if(val < root -> val)
        {
            root -> l = Insert(root -> l,val);
            if(get_height(root -> l) - get_height(root -> r) == 2)
                root = Fix(root);
        }
    else
        {
            root -> r = Insert(root -> r,val);
            if(get_height(root -> r) - get_height(root -> l) == 2)
                root = Fix(root);
        }
    return root;
}
int ans[25],cnt,n;
bool flag;
void bfs(node *root)
{
    queue<node* >Q;
    while(!Q.empty()) Q.pop();
    Q.push(root);
    int num = 1;
    while(!Q.empty())
    {
        node *tmp = Q.front();
        Q.pop();
        ans[cnt++] = tmp -> val;
        if(tmp -> l)
            Q.push(tmp -> l),num++;
        else
        {
            if(num != n) flag = false;
        }
        if(tmp -> r)
            Q.push(tmp -> r),num++;
        else
        {
            if(num != n) flag = false;
        }
    }
    return ;
}
int main()
{
    node *root = nullptr;
    scanf("%d",&n);
    for(int i = 1;i <= n;++i)
    {
        int a;
        scanf("%d",&a);
        root = Insert(root,a);
    }
   // printf("%d\n",root -> val);
    cnt = 0,flag = true;
    bfs(root);
    for(int i = 0;i < cnt;++i)
        printf("%d%c",ans[i],i == cnt - 1?'\n':' ');
    if(!flag) puts("NO");
    else puts("YES");
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章