1. 程式人生 > >求二叉樹第K層結點個數

求二叉樹第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;
}