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

完全二叉树

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

完全二叉树示意图

直接上思路。层序遍历一下,遇到第一个叶子 那么后面出现的节点都应该是叶子节点。当然 还要判断上图的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));


}

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/106949635