noj1525求二叉树第K层结点个数

1525.求二叉树第K层结点个数

时限:1000ms 内存限制:10000K  总时限:3000ms

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

Output

第一行为二叉树第L层的结点个数

第二行为空行

 
Sample Input
9 3
8 3 10 1 6 0 14 0 0 4 7 0 0 13
 
Sample Output
3
 
提示:建立二叉链表时,可以借助队列
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
typedef struct node
{
    char data;
    struct node*lchild;
    struct node*rchild;
}BiTNode,*BiTree;
void creat(BiTree*root)
{
    BiTree s;
    BiTree Q[100];
    int front=1,rear=0,n;
    char ch;
    while (ch != '\n')
    {
        scanf("%d",&n);
        ch = getchar();
        if(n==0) s=NULL;
        else
        {
            s=(BiTree)malloc(sizeof(BiTNode));
            s->data=n;
            s->lchild=NULL;
            s->rchild=NULL;
        }
        Q[++rear]=s;
        if(rear==1) *root=s;
        else
        {
            if(s&&Q[front])
            {
                if(rear%2==0) Q[front]->lchild=s;
                else Q[front]->rchild=s;
            }
            if(rear%2==1) front++;
        }
    }
}
int num(BiTree root,int k)
{
   if(root==NULL||k==0)
    return 0;
   if(root!=NULL&&k==1)
    return 1;
   return num(root->lchild,k-1)+num(root->rchild,k-1);
}
int main()
{
    BiTree root;
    int number;
    int k;
    int n;
    scanf("%d",&number);
    scanf("%d",&k);
    creat(&root);
    n=num(root,k);
    printf("%d\n",n);
    return 0;
}


猜你喜欢

转载自blog.csdn.net/rain699/article/details/80464394