题意:已知二叉树的层次遍历的序列,求二叉树的深度及先序遍历
分析:在层次遍历中,先遍历的结点,其左右孩子结点,肯定比后遍历的结点的孩子结点先遍历
二叉树中最多有两个孩子结点
即可用标记的方法,标记出孩子结点的序号,具体可以结合代码理解
代码:
#include<stdio.h>
#include<stdlib.h>
typedef struct stu
{
struct stu *l,*r;
int c;
}Tree;
void My_printq(Tree *T)
{
if(T!=NULL){
printf(" %d",T->c);
My_printq(T->l);
My_printq(T->r);
}
}
int Deep(Tree *T) //求深度
{
int l,r;
if(T==NULL)
return 0;
l=1+Deep(T->l);
r=1+Deep(T->r);
return l>r?l:r;
}
int main()
{
int i,j,n,m,c[1010];
Tree *T=NULL,*node[1010];
scanf("%d",&m);
while(m--){
n=0;
for(j=1;;j++){
scanf("%d",&c[j]);
if(c[j]==-1)
break;
if(c[j]){
node[j]=(Tree *)malloc(sizeof(Tree));
node[j]->c=c[j];
}
else
node[j]=NULL;
}
n=j-1;
i=2;
T=node[1];
for(j=1;j<=n;j++){
if(c[j]){
if(i<=n)
node[j]->l=node[i++];
else
node[j]->l=NULL;
if(i<=n)
node[j]->r=node[i++];
else
node[j]->r=NULL;
}
}
n=Deep(T);
printf("%d",n);
My_printq(T);
printf("\n");
}
return 0;
}