【面试题-链表】判断一个二叉树是否是完全二叉树

完全二叉树

如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布,则此二叉树被称为完全二叉树。

完全二叉树示意图

直接上思路。层序遍历一下,遇到第一个叶子 那么后面出现的节点都应该是叶子节点。当然 还要判断上图的b)的情况

由于没有大量的数据来验证,我在代码里自己构造了一个数据,有错误欢迎指正~

【代码】

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int w;
    node *left;
    node *right;
};
bool bfs(node *head)
{
    queue<node *>que;
    que.push(head);

    int flag=0;
    while(que.size())
    {
        node *now=que.front();que.pop();
        //printf("w:%d\n",now->w);

        if(flag&&(now->left!=NULL||now->right!=NULL)) {//前面出现叶子且当前不是叶子
            //printf("wwww");
            return false;
        }
        if(now->left==NULL&&now->right!=NULL) {//只有右节点

            return false;
        }
        if(now->left==NULL&&now->right==NULL) {
            flag=1;
        }
        if(now->left!=NULL) que.push(now->left);
        if(now->right!=NULL) que.push(now->right);
    }

}
int main()
{
    node *head=new node();
    head->w=1;

    node *l1=new node();
    l1->w=2;
    node *r1=new node();
    r1->w=3;

    head->left=l1;
    head->right=r1;

    node *l2=new node();
    l2->w=4;

    node *r2=new node();
    r2->w=5;

    l1->left=l2;
    l1->right=r2;

    node *l3=new node();
    l3->w=6;
    r1->left=l3;


    printf("%d\n",bfs(head));


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

长沙大学ccsu_deer

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值