1123 Is It a Complete AVL Tree (30分)

AVL操作,模板题。

#include <bits/stdc++.h>
using namespace std;
struct Node{
    int val,left=-1,right=-1,height=1;
}node[25];
bool init=false;
int curridx=0;
int getHeight(int root){
    if(root==-1)return 0;
    return node[root].height;
}
int getBalanceFactor(int root){
    return getHeight(node[root].left)-getHeight(node[root].right);
}
void updateHeight(int root){
    node[root].height=max(getHeight(node[root].left),getHeight(node[root].right))+1;
}
void L(int &root){
    int temp=node[root].right;
    node[root].right=node[temp].left;
    node[temp].left=root;
    updateHeight(root);
    updateHeight(temp);
    root=temp;
}
void R(int &root){
    int temp=node[root].left;
    node[root].left=node[temp].right;
    node[temp].right=root;
    updateHeight(root);
    updateHeight(temp);
    root=temp;
}
void insertNode(int &root, int v){
    if(root==-1){
        node[curridx].val=v;
        root=curridx;
        curridx++;
        return;
    }
    if(v<node[root].val){
        insertNode(node[root].left,v);
        updateHeight(root);
        if(getBalanceFactor(root)==2){
            if(getBalanceFactor(node[root].left)==1){
                R(root);
            }else if(getBalanceFactor(node[root].left)==-1){
                L(node[root].left);
                R(root);
            }
        }
    }else{
        insertNode(node[root].right,v);
        updateHeight(root);
        if(getBalanceFactor(root)==-2){
            if(getBalanceFactor(node[root].right)==-1){
                L(root);
            }else if(getBalanceFactor(node[root].right)==1){
                R(node[root].right);
                L(root);
            }
        }
    }
}

int main(){
    int n,m,num;
    scanf("%d",&n);
    int root=-1;
    for(int i=0;i<n;i++){
        int a;
        scanf("%d",&a);
        insertNode(root,a);
    }
    queue<int> q;
    q.push(root);
    bool lastpush=true,res=true;
    int lastlevel=node[root].height;
    while(!q.empty()){
        int top=q.front();
        printf("%d",node[top].val);
        q.pop();
        if(node[top].left!=-1){
            q.push(node[top].left);
            if(!lastpush)res=false;
            lastpush=true;
        }else lastpush=false;
        if(node[top].right!=-1){
            q.push(node[top].right);
            if(!lastpush)res=false;
            lastpush=true;
        }else lastpush=false;
        if(!q.empty())printf(" ");
        else printf("\n");

    }
    if(res)printf("YES\n");
    else printf("NO\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值