数据结构-树-计算一棵二叉树中所有非叶子结点的个数

注:不同数据创建方式参考数据结构-二叉树-计算二叉树的非叶子结点数-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;
}

 

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值