求二叉樹第K層結點個數
阿新 • • 發佈:2018-12-30
描述如果按照二叉樹的順序儲存結構,逐個輸入二叉樹的結點值,(即按從上到下、從左至右的順序,逐個輸入結點值,對於
空結點使用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輸出樣例
空結點使用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; }