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;
}