习题日常第二十八练

1玩转二叉树(题目链接

二叉树的模板,一直没时间学,凑巧看到这道题,通过前序中序建树和通过后序中序建树。关于这个题,我们要先根据前序和中序建树,然后翻转,再输出即可。代码如下。

#include<cmath>
#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
#include<bitset>
#include<sstream>


#define ll long long int

const ll mod=100003;

using namespace std;
ll n,m,a[100],tot=0,b[100],vis[1000];
struct node
{
    ll l=-1,r=-1,v=-1;
}t[110];
deque<ll> p;
ll build(ll l,ll r,ll ri)
{
    ll i;
    if(l==r)
    {
        t[++tot].l=-1;
        t[tot].r=-1;
        t[tot].v=b[ri];
        return tot;
    }
    if(l>r||ri>n)
        return -1;
    t[++tot].v=b[ri];
    ll xp=tot;
    for(i=l;i<=r;i++)
    {
        if(a[i]==b[ri])
            break;
    }
    t[xp].l=build(l,i-1,ri+1);
    t[xp].r=build(i+1,r,ri+i-l+1);
    return xp;
}
void fan(ll ri)
{
    if(t[ri].v==-1)
        return;
    if(t[ri].l!=-1||t[ri].r!=-1)
    {
        ll xp=t[ri].l;
        t[ri].l=t[ri].r;
        t[ri].r=xp;
        fan(t[ri].l);
        fan(t[ri].r);
    }
    return;
}
int main()
{
    ios::sync_with_stdio(false);
    ll i=0,j,l=0,k,x=0,y=0,hed,sum=0;
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>a[i];
    for(i=1;i<=n;i++)
        cin>>b[i];
    build(1,n,1);
    fan(1);
    p.push_back(1);
    while(!p.empty())
    {
        ll xp=p.front();
        p.pop_front();
        if(xp==1)
        {
            cout<<t[xp].v;
        }
        else
            cout<<" "<<t[xp].v;
        if(t[xp].l!=-1)
            p.push_back(t[xp].l);
        if(t[xp].r!=-1)
            p.push_back(t[xp].r);
    }
      return 0;

}

2这是二叉搜索树吗?(题目链接

今天二叉树专题。这个题老老实实根据题目给的要求建树,若建树后节点数与给出节点数相同,则建树成功,若不成功根据镜像建树,若还不成功输出no,成功后只需要输出后序遍历即可。代码如下。

#include<cmath>
#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<math.h>
#include<stack>
#include<algorithm>
#include<queue>
#include<bitset>
#include<sstream>
#define  ll long long int

const ll mod=100003;

using namespace std;
ll n,m,a[10100],tot=0;
struct node
{
    ll l=-1,r=-1,v=-1;
}t[20100];
ll get1(ll ri,ll l,ll r)
{
   if(l==r)
   {
       t[++tot].l=-1;
       t[tot].r=-1;
       t[tot].v=a[ri];
       return tot;
   }
   if(l>r)
    return -1;
    ll i,j;
   for(i=l+1;i<=r;i++)
   {
       if(a[i]>=a[ri])
        break;
   }
   for(j=r;j>l;j--)
   {
       if(a[j]<a[ri])
        break;
   }
   if(i-j==1)
   {
   t[++tot].v=a[ri];
   ll xp=tot;
    t[xp].l=get1(ri+1,l+1,i-1);
    t[xp].r=get1(j+1,j+1,r);
   return xp;
   }
   else
    return -1;
}
ll get2(ll ri,ll l,ll r)
{
   if(l==r)
   {
       t[++tot].l=-1;
       t[tot].r=-1;
       t[tot].v=a[ri];
       return tot;
   }
   if(l>r||ri>n||ri<1)
    return -1;
    ll i,j;
   for(i=l+1;i<=r;i++)
   {
       if(a[i]<a[ri])
        break;
   }
   for(j=r;j>l;j--)
   {
       if(a[j]>=a[ri])
        break;
   }
   if(i-j==1)
   {
   t[++tot].v=a[ri];
   ll xp=tot;
    t[xp].l=get2(ri+1,l+1,i-1);
    t[xp].r=get2(j+1,j+1,r);
   return xp;
   }
   else
    return -1;
}
void print(ll i)
{
    if(t[i].l!=-1)
    print(t[i].l);
    if(t[i].r!=-1)
    print(t[i].r);
    if(i==1)
    cout<<t[i].v;
    else
        cout<<t[i].v<<" ";
}
int main()
{
    ios::sync_with_stdio(false);
    ll i=0,j,l,k,x=0,y=0,hed,sum=0;
    cin>>n;
    for(i=1;i<=n;i++)
        cin>>a[i];
       x=get1(1,1,n);
    if(tot!=n)
    {
         for(i=1;i<=tot;i++)
    {
        t[i].l=t[i].r=t[i].v=-1;
    }
     tot=0;
        get2(1,1,n);
    }
    if(tot==n)
    {
        cout<<"YES"<<endl;
        print(1);
    }
    else
        cout<<"NO";
      return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值