注:本题是二叉树顺序存储结构,并且为完全二叉树。
链式存储结构可以查看 数据结构-二叉树的创建(递归)-CSDN博客
Description |
根据给定二叉树的顺序存储结点值序列,求出某个结点所在的层数以及该层的结点数。 说明: 输入: 第一行为该二叉树按顺序存储的元素值序列,其中0表示虚结点,大写字母或数字表示结点的值。 第二行为给定结点(需对该结点求其所在层数以及所在层的元素数) 输出: 第一行为指定结点所在层 第二行为指定结点所在层的结点数 |
Sample Input |
A B C 0 E F 0 0 0 G 0 H 0 0 0 0 0 0 0 I 0 0 0 J H |
Sample Output |
4 2 |
Hint |
输出有换行 |
#include <iostream>
#include <bits/stdc++.h>
#define Max_size 105
using namespace std;
typedef struct
{ // 定义存储结构
char *elem;
int length;
} BiTree;
void initT(BiTree &T)
{ // 初始化
T.elem = new char[Max_size];
T.length = Max_size;
}
void creatT(BiTree &T)
{
char c, ch;
int cnt = 1;
while (cin >> c)
{
T.elem[cnt] = c;
cnt++;
ch = getchar();
if (ch == '\n')
break;
}
T.length = cnt - 1;
}
void serch(BiTree T, char c, int &cnt, int &num)
{
int i, j, k;
for (i = 1; i <= T.length; i++)
{
if (T.elem[i] == c)
{ // 找到关键字符
for (j = 1; j <= T.length; j++)
{
if ((pow(2, j - 1) - 1) < i && (pow(2, j) - 1 >= i))
{ // 判断在第几层
cnt = j;
for (k = pow(2, j - 1); k <= pow(2, j) - 1; k++)
{ // 判断这一层有多少个结点
if (T.elem[k] != '0')
num++;
}
break;
}
}
}
}
}
int main()
{
BiTree T;
initT(T);
creatT(T);
int cnt, num = 0;
char key;
cin >> key;
serch(T, key, cnt, num);
cout << cnt << "\n"
<< num << "\n";
return 0;
}