pat 1110 Complete Binary Tree (25) 判断是否为完全二叉树

16 篇文章 0 订阅

传送门


满二叉树一定是完全二叉树,完全二叉树不一定为满二叉树.

所谓完全二叉树就是除最后一层和次最后一层可以存在叶子节点其余的必须为满二叉树,且结点要靠左,即左子树优先.


判断是否为完全二叉树 即可以直接对所给定的节点之间的关系进行层次遍历,遍历过程中记录结点个数,当找到一个没有孩子结点的结点时判断是否遍历了N个结点即可.、

#include<bits/stdc++.h>

using namespace std;
const int maxn = 30;
int n;
struct node
{
    int l,r,f;
}a[maxn];
int getnum(char *s)
{
    int len = strlen(s);
    int num = 0;
    for(int i = 0;i < len;++i)
        num = num * 10 + s[i] - '0';
    return num;
}
void bfs()
{
    queue<int>Q;
    while(!Q.empty())
        Q.pop();
    int rot = -1;
    for(int i = 0;i < n;++i)
        if(a[i].f == -1)
        {
            rot = i;
            break;
        }
    Q.push(rot);
    int num = 1,cur;
    while(!Q.empty())
    {
        cur = Q.front();
        Q.pop();
        int l = a[cur].l , r= a[cur].r;
        if(l == -1)
            break;
        num++;
        Q.push(l);
        if(r == -1)
            break;
        num++;
        Q.push(r);
    }
    while(!Q.empty())
    {
        cur = Q.front();
        Q.pop();
    }
    if(num == n)
        printf("YES %d\n",cur);
    else
        printf("NO %d\n",rot);
    return ;
}
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i = 0;i <= n;++i)
            a[i].f = -1;
        for(int i = 0;i < n;++i)
        {
            char s1[5],s2[5];
            scanf("%s %s",s1,s2);
            if(s1[0] == '-')
                a[i].l = -1;
            else
                a[i].l = getnum(s1),a[a[i].l].f = i;
            if(s2[0] == '-')
                a[i].r = -1;
            else
                a[i].r = getnum(s2),a[a[i].r].f = i;
        }
        bfs();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Marcus-Bao

万水千山总是情,只给五角行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值