pta浪漫侧影
中序和后序遍历创建二叉树、层序遍历
#include<bits/stdc++.h>
using namespace std;
const int N=400000;
int po[N],mid[N],id[N],lc[N],rc[N],m[N];
int depth[N],cnt=0;
int creat(int lm,int rm,int lp,int rp)
{
if(lp>rp)
return 0;
int root=po[rp];
int numl=rm-id[root];
lc[root]=creat(id[root]+1,rm,rp-numl,rp-1);
rc[root]=creat(lm,id[root]-1,lp,rp-numl-1);
return root;
}
vector<int>v[101000];
void bianli(int root)
{
queue<int>q;
depth[root]=1;
q.push(root);
cnt=depth[root];
while(!q.empty())
{
int w=q.front();
q.pop();
v[depth[w]].push_back(w);
cnt=depth[w];
if(lc[w])
{
depth[lc[w]]=depth[w]+1;
q.push(lc[w]);
}
if(rc[w])
{
depth[rc[w]]=depth[w]+1;
q.push(rc[w]);
}
}
}
int main()
{
int i,j,k,n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>m[i];
id[m[i]]=i;
}
for(i=1;i<=n;i++)
{
cin>>po[i];
}
creat(1,n,1,n);
bianli(po[n]);
printf("R: ");
for(i=1;i<=cnt;i++)
{
if(i==1)
printf("%d",v[i][0]);
else
printf(" %d",v[i][0]);
}
printf("\n");
printf("L: ");
for(i=1;i<=cnt;i++)
{
if(i==1)
printf("%d",v[i][v[i].size()-1]);
else
printf(" %d",v[i][v[i].size()-1]);
}
}
pta玩转二叉树
前序遍历中序遍历创建二叉树
//void (int lm,int rm,int lp,int rp)
//{
//
// int root=pre[lp];
// //找到 这个点在中序中对应的下标是几 可以求出它的左边有几个节点
// int numl=id[root]-lm+1;
// lc[root]=(lm,id[root]-1,lp+1,lp+numl);
// rc[root]=(id[root]+1,rm,lp+numl+1,rp);
//}
#include<bits/stdc++.h>
using namespace std;
const int N=40000;
int root[N],id[N],pre[N],m[N],lc[N],rc[N];
int creat(int lm,int rm,int lp,int rp)
{
// printf("+++++\n");
if(lm>rm)
return 0;
int root=pre[lp];
int numl=id[root]-lm;
rc[root]=creat(lm,id[root]-1,lp+1,lp+numl);
lc[root]=creat(id[root]+1,rm,lp+numl+1,rp);
return root;
}
void bianli(int root)
{
queue<int>q;
q.push(root);
int flag=0;
while(!q.empty())
{
int w=q.front();
q.pop();
if(flag==0)
{
flag++;printf("%d",w);
}
else
printf(" %d",w);
if(lc[w])
q.push(lc[w]);
if(rc[w])
q.push(rc[w]);
}
}
int main()
{
int i,j,k,n;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>m[i];
id[m[i]]=i;
}
for(i=1;i<=n;i++)
{
cin>>pre[i];
}
creat(1,n,1,n);
// printf("%d\n",pre[1]);
bianli(pre[1]);
}