【数据结构】二叉搜索树,AVL 作业存档

目录

A:二叉排序树 - 文本输出

B:销售排行榜

C:   二叉排序树-平衡因子

D: 案例 1-1.1 二分查找

E: 进阶实验 1-3.1:两个有序序列的中位数 


A:二叉排序树 - 文本输出

·上课写的

#include<bits/stdc++.h>
using namespace std;

struct BSTnode{
    int data;
    BSTnode*lc;
    BSTnode*rc;
    int level;
};

BSTnode* insert(BSTnode* &B,int x)
{
    if(B==nullptr){
        B=new BSTnode;
        B->data=x;
        B->lc=B->rc=nullptr;
    //    cout<<B->data<<endl;
    }else if(B->data>x){
        insert(B->lc,x);
    }else if(B->data<x){
        insert(B->rc,x);
    }
    return B;
}

void level(BSTnode* &B)
{
    queue <BSTnode*>Q;
    Q.push(B);
    B->level=0;
    while(!Q.empty())
    {
        BSTnode*node=Q.front();Q.pop();
        if(node->lc!=nullptr)
        {
            node->lc->level=node->level+1;
            Q.push(node->lc);
        }
        if(node->rc!=nullptr)
        {
            node->rc->level=node->level+1;
            Q.push(node->rc);
        }
    }

}
int Pre(BSTnode* &B,int level)
{
    if(B==nullptr){for(int i=0;i<level;i++)
    cout<<"    ";
        cout<<"#\n";return 0;}
        for(int i=0;i<B->level;i++)
    cout<<"    ";
    cout<<B->data<<endl;
    if(B->lc!=nullptr||B->rc!=nullptr)
    {
        Pre(B->lc,B->level+1);
        Pre(B->rc,B->level+1);
    }
    return 0;
}


int main()
{
    int n,x;cin>>n;
    BSTnode*B=nullptr;
    for(int i=0;i<n;i++)
    {
        cin>>x;
        insert(B,x);
    }
    level(B);
    Pre(B,0);
    return 0;
}

        

 

 

B:销售排行榜

·蓝了aaaaa

#include<bits/stdc++.h>
using namespace std;

struct item{
    string name;
    int time;
    int value;
};
item t[100000];
int cmp1(item a,item b)
{
    return a.name<b.name;
}
int cmp2(item a,item b)
{
    if(a.time!=b.time)return a.time>b.time;
    else return a.name<b.name;

}
int main()
{
    
    string date,name;
    int i=0;
    int time,price;
    while(cin>>name>>time>>price>>date)
    {
        t[i].name=name;
        t[i].time=time;
        t[i].value=price*time;
        i++;
    }
    sort(t,t+i,cmp1);
    for(int j=0;j<i-1;j++)
    {
        if(t[j].name==t[j+1].name)
        {
            t[j].name="#";
            t[j+1].time+=t[j].time;
            t[j+1].value+=t[j].value;
        }
    }
    sort(t,t+i,cmp2);
    for(int j=0;j<i;j++)
    {
        if(t[j].name!="#")
        cout<<t[j].name<<" "<<t[j].time<<" "<<t[j].value<<endl;
    }
    return 0;
}

        

 

 

C:   二叉排序树-平衡因子

·平衡因子=左子树深度-右子树深度

#include<bits/stdc++.h>
using namespace std;

struct BSTnode{
    int data;
    BSTnode*lc;
    BSTnode*rc;
    int level;
};

BSTnode* insert(BSTnode* &B,int x)
{
    if(B==nullptr){
        B=new BSTnode;
        B->data=x;
        B->lc=B->rc=nullptr;
    //    cout<<B->data<<endl;
    }else if(B->data>x){
        insert(B->lc,x);
    }else if(B->data<x){
        insert(B->rc,x);
    }
    return B;
}

void level(BSTnode* &B)
{
    queue <BSTnode*>Q;
    Q.push(B);
    B->level=0;
    while(!Q.empty())
    {
        BSTnode*node=Q.front();Q.pop();
        if(node->lc!=nullptr)
        {
            node->lc->level=node->level+1;
            Q.push(node->lc);
        }
        if(node->rc!=nullptr)
        {
            node->rc->level=node->level+1;
            Q.push(node->rc);
        }
    }

}
int getdepth(BSTnode* &B)
{
    if(B==nullptr)return 0;
    return max(getdepth(B->lc),getdepth(B->rc))+1;
}
int Pre(BSTnode* &B,int level)
{
    if(B==nullptr)
    {for(int i=0;i<level;i++)
    cout<<"    ";
    cout<<"#\n";return 0;}
    for(int i=0;i<B->level;i++)
    cout<<"    ";
    cout<<B->data<<"("<<getdepth(B->lc)-getdepth(B->rc)<<")"
    <<endl;
    if(B->lc!=nullptr||B->rc!=nullptr)
    {
        Pre(B->lc,B->level+1);
        Pre(B->rc,B->level+1);
    }
    return 0;
}


int main()
{
    int n,x;cin>>n;
    BSTnode* B=nullptr;
    for(int i=0;i<n;i++)
    {
        cin>>x;
        insert(B,x);
    }
    level(B);
    Pre(B,0);
    return 0;
}

        

 

 

D: 案例 1-1.1 二分查找

·不注意细节就会浪费很多很多时间

#include<bits/stdc++.h>
using namespace std;

int binary(int n,int a[],int x)
{
    int mid,l=0,r=n-1;
    while(r>=l)
    {
        mid=l+(r-l)/2;
        //cout<<l<<" "<<r<<" "<<mid<<endl;
        if(a[mid]==x)
        {
            for(int i=mid;i>0;i--)
        {
            if(a[i]!=x)return i+2;
        }
         return 1;
        }
        else if(a[mid]>x)
        {
            r=mid-1;
        }
        else l=mid+1;
    }
    return -1;
}
int main()
{
    int n;cin>>n;
    int a[n];
    for(int i=0;i<n;i++)cin>>a[i];
    int x;cin>>x;
    cout<<binary(n,a,x);
    return 0;
}

        

 

E: 进阶实验 1-3.1:两个有序序列的中位数 

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;cin>>n;
    int a[n],b[n];
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++)cin>>b[i];
    if(n%2==0)
    cout<<(a[n/2-1]+b[n/2-1])/2;
    else
    cout<<(a[n/2]+b[n/2])/2;
    return 0;
}

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值