描述
如果按照二叉树的顺序存储结构,逐个输入二叉树的结点值,(即按从上到下、从左至右的顺序,逐个输入结点值,对于
空结点使用0表示),则一棵二叉树可以被一个序列唯一表示,如A表示一棵只有根结点的二叉树;A#C表示一个深度为2、根结点左子树为空的二叉树。请根据输入的二叉树的序列,创建二叉链表,并根据输入的层数L,计算并输出二叉树第L层结点的个数。
空结点使用0表示),则一棵二叉树可以被一个序列唯一表示,如A表示一棵只有根结点的二叉树;A#C表示一个深度为2、根结点左子树为空的二叉树。请根据输入的二叉树的序列,创建二叉链表,并根据输入的层数L,计算并输出二叉树第L层结点的个数。
输入
第一行为二叉树中非空结点的个数K及要查找的层数L,1<=K<=2^10,L>=1;
第二行为按照顺序结构逐个输入的二叉查找树的n个结点值(包含空结点),n个结点值之间用空格隔开,1<=n<=2^10
第二行为按照顺序结构逐个输入的二叉查找树的n个结点值(包含空结点),n个结点值之间用空格隔开,1<=n<=2^10
输出
第一行为二叉树第L层的结点个数
第二行为空行
第二行为空行
输入样例
9 3
8 3 10 1 6 0 14 0 0 4 7 0 0 13
8 3 10 1 6 0 14 0 0 4 7 0 0 13
输出样例
3
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int sum=0;
int K,L;
typedef struct binode
{
int data;
struct binode *lchild,*rchild;
}Binode,*Bitree;
void btinsert(Bitree &T,int i,int j,int d)
{
if(!d) return;
if(i==j)
{
T=(Bitree)malloc(sizeof(Binode));
T->data=d;
T->lchild=T->rchild=NULL;
}
else
{
int t=i;
while(t!=j*2&&t!=j*2+1)
{
t/=2;
}
if(t==j*2)
{
btinsert(T->lchild,i,j*2,d);
}
else
{
btinsert(T->rchild,i,j*2+1,d);
}
}
}
void traversal(Bitree T,int l)
{
if(T==NULL) return;
if(l==L) sum++;
traversal(T->lchild,l+1);
traversal(T->rchild,l+1);
}
int main()
{
Bitree h=NULL;
cin>>K>>L;
for(int i=1;K>0;i++)
{
int d;
scanf("%d",&d);
if(d) K--;
btinsert(h,i,1,d);
}
traversal(h,1);
printf("%d\n",sum);
return 0;
}