注:不同数据创建方式参考数据结构-二叉树-计算二叉树的非叶子结点数-CSDN博客
Description
已知一棵二叉树按顺序存储结构存储。按输入结点数和各结点元素值,创建一个一维数组,存储二叉树,并计算非叶子结点数。
Input
仅有一组测试数据
第一行:二叉树的结点数n(1<n<1000)
第二行:输入一棵二叉树各结点(含虚结点) 的值。其中0表示虚结点(不存在此结点),#表示结束标志。
Output
输出非叶子结点的个数。注:输出值后没有空格和换行符。
Sample Input
7
A B C D E 0 0 0 0 F G #
Sample Output
3
#include <bits/stdc++.h>
using namespace std;
typedef struct Binode
{
char data;
Binode *lc, *rc;
} Binode, *Bitree;
void initTree(Bitree &T)
{
T = new Binode;
cin >> T->data;
T->lc = NULL;
T->rc = NULL;
}
queue<Bitree> Q;
void deal(Bitree &T)
{ // 把队列中没出队的元素出队
while (!Q.empty())
{
Q.front()->lc = NULL;
Q.front()->rc = NULL;
Q.pop();
}
}
void creatT(Bitree &T)
{
char ch;
while (!Q.empty())
{
cin >> ch;
if (ch == '#')
{ // 处理队列
deal(T);
return;
}
Bitree q = new Binode;
q->data = ch;
if (ch != '0')
{ // 不是空结点就进队并勾链
Q.front()->lc = q;
q->lc = NULL;
q->rc = NULL;
Q.push(Q.front()->lc);
}
cin >> ch;
Bitree m = new Binode;
m->data = ch;
if (ch != '0')
{
Q.front()->rc = m;
m->lc = NULL;
m->rc = NULL;
Q.push(Q.front()->rc);
}
Q.pop();
}
}
void serchT(Bitree T, int &cnt)
{
Q.push(T);
while (!Q.empty())
{
if (Q.front()->lc != NULL)
Q.push(Q.front()->lc);
if (Q.front()->rc != NULL)
Q.push(Q.front()->rc);
if (Q.front()->lc != NULL && Q.front()->rc != NULL)
cnt++; // 左右孩都不空进加一
Q.pop();
}
}
int main()
{
Bitree T;
int n;
cin >> n;
initTree(T);
Q.push(T);
creatT(T);
int cnt = 0;
serchT(T, cnt);
cout << cnt;
return 0;
}