【题解】牛牛爬树
题意
给你一个长度为的序列,让你构建一棵二叉排序树,然后要求从下到上,从左到右遍历这棵树的节点,并按顺序输出出来。
题解
相当于要求层次遍历从下到上进行遍历,那我们依然可以按正常的层次遍历来做,但是我们记录值的时候也一层一层记录就可以了,所以要求在建树的时候增加一下每个节点所在的层数,在进行正常层次遍历的时候判断一下当前是在那一层即可,最后输出的时候从最后一层开始输出。
复杂度
时间复杂度
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct BiTree
{
int v;
int dep;
BiTree *lchild;
BiTree *rchild;
};
void Insert(BiTree *&T,int v,int dep)
{
if(T==NULL)
{
T=new BiTree;
T->v=v;
T->dep=dep;
T->lchild=NULL;
T->rchild=NULL;
return;
}
if(T->v>v)
Insert(T->lchild,v,dep+1);
else
Insert(T->rchild,v,dep+1);
}
vector<vector<BiTree*> >ans;
queue<BiTree *>Q;
int main()
{
int n;
scanf("%d",&n);
BiTree *T=NULL;
for(int i=0; i<n; i++)
{
int x;
scanf("%d",&x);
Insert(T,x,1);
}
while(!Q.empty()) Q.pop();
Q.push(T);
vector<BiTree *>tmp;
while(!Q.empty())
{
T=Q.front();
Q.pop();
if(tmp.size()==0)
tmp.push_back(T);
else if(T->dep==tmp[0]->dep)
tmp.push_back(T);
else
{
ans.push_back(tmp);
tmp.clear();
tmp.push_back(T);
}
if(T->lchild!=NULL)
Q.push(T->lchild);
if(T->rchild!=NULL)
Q.push(T->rchild);
}
ans.push_back(tmp);
for(int i=ans.size()-1;i>=0;i--)
{
for(int j=0;j<ans[i].size();j++)
printf("%d ",ans[i][j]->v);
}
printf("\n");
return 0;
}