注:具体可以结合 数据结构-二叉树-计算二叉树叶子结点数-CSDN博客进行学习,不同的是创建二叉树的方式有所区别,本文采用递归创建。
Description |
输入: 第一行:输入结点总数 第二行:根结点元素值 第三行至最后:每行分别表示各结点以及其左右孩子。举例: A B 0 则表示结点A的左孩子为B,右孩子为空。 输出:输出非叶子结点的个数。 |
Sample Input |
7 A A B G B 0 C G 0 0 C D F D 0 E F 0 0 E 0 0 |
Sample Output |
4 |
Hint |
输出有换行 |
#include <bits/stdc++.h>
using namespace std;
typedef struct BiTnode
{ // 二叉链表存储结构
int num;
char data;
BiTnode *lc;
BiTnode *rc;
} BiTnode, *BiTree;
void initTree(BiTree &T, char data = '*')
{ // 初始化树
T = new BiTnode;
T->lc = NULL;
T->rc = NULL;
if (data == '*')
cin >> T->data; // 先输入根节点
else
T->data = data;
}
queue<BiTree> Q;
void creatTree(BiTree &T)
{ // 递归创建二叉树
if (Q.empty())
return; // 递归的终止条件
char ch;
int cnt = 1; // 计数 1左 2右
while (cin >> ch) // 输入此时根节点的左孩、右孩
{
if (T->data == ch)
continue;
BiTnode *p = NULL;
if (ch != '0')
initTree(p, ch);
if (cnt == 1)
T->lc = p;
else
T->rc = p;
if (p)
Q.push(p);
if (cnt == 2)
break;
cnt++;
}
Q.pop();
creatTree(Q.front()); // 递归
}
void Levelorder(BiTree T)
{ // 层次遍历二叉树
int num = 0;
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) // 两个子孩子都不为空计数器++
num++;
Q.pop();
}
cout << num << "\n";
}
int main()
{
BiTree Tree; // 二叉链表
int n;
cin >> n;
Tree->num = n;
initTree(Tree);
Q.push(Tree); // 先把根节点进队需要满足判断
creatTree(Tree);
Levelorder(Tree);
return 0;
}