求二叉树第K层结点个数

描述
如果按照二叉树的顺序存储结构,逐个输入二叉树的结点值,(即按从上到下、从左至右的顺序,逐个输入结点值,对于
空结点使用0表示),则一棵二叉树可以被一个序列唯一表示,如A表示一棵只有根结点的二叉树;A#C表示一个深度为2、根结点左子树为空的二叉树。请根据输入的二叉树的序列,创建二叉链表,并根据输入的层数L,计算并输出二叉树第L层结点的个数。
 
输入
第一行为二叉树中非空结点的个数K及要查找的层数L,1<=K<=2^10,L>=1;
第二行为按照顺序结构逐个输入的二叉查找树的n个结点值(包含空结点),n个结点值之间用空格隔开,1<=n<=2^10
 
输出
第一行为二叉树第L层的结点个数
第二行为空行
 
输入样例
9 3
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;
}

猜你喜欢

转载自blog.csdn.net/zhao2018/article/details/80861193