题解 | #判断是不是完全二叉树#

判断是不是完全二叉树

https://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */
#include "stdlib.h"
#include <stdbool.h>

typedef struct Queue{
    struct TreeNode *node;
    struct Queue* next;
}Queue; //队列元素结构体

typedef struct Listqueue{
    Queue *front;
    Queue *last; 
}Listqueue;  //带头尾节点的队列

//入队
void Push_queue(struct TreeNode* tree, Listqueue *listqueue)
{
    Queue* time=malloc(sizeof(Queue));
    time->node=tree;
    time->next=NULL;
    if(listqueue->front==NULL)
    {
        listqueue->front=time;
        listqueue->last=time;
    }
    else 
    {
        listqueue->last->next=time;
        listqueue->last=time;
    }
}

//出队,并且返回一个队列元素
struct TreeNode* pop_queue(Listqueue* listqueue)
{
    if(listqueue->front==NULL)
        return NULL;
    else
    {
        Queue *time=malloc(sizeof(Queue));
        time=listqueue->front;
        listqueue->front=time->next;
        time->next=NULL;
        return time->node;
    }
}

//根据层序遍历判断该二叉树是否为完全二叉树
int cengxu_queue(struct TreeNode* tree)
{
    Listqueue* listqueue=malloc(sizeof(Listqueue));
    listqueue->front=NULL;
    listqueue->last=NULL;
    struct TreeNode* p=tree;
    int count_left=0,count_right=0; //当前结点的左右结点标志位
            //如果count_left=0,count_right=1,则不是完全二叉树……
    //标志位,意味着当前访问的二叉树结点是否违反完全二叉树的条件;
    int count=1; 

    while(p != NULL)
    {
        if(p->left != NULL)
        {
            Push_queue(p->left, listqueue);
            if(count==0)
                return 0;
            count_left=1;
        }
        else 
        {
            count_left=0;
            count=0;    //此时,层序遍历中不允许再出现新的结点
        }  
        if(p->right != NULL)
        {
            Push_queue(p->right, listqueue);
            if(count==0)
                return 0;
            count_right=1;
        }
        else 
        {
            count_right=0;
            count=0;    //此时,层序遍历中不允许再出现新的结点
        }
        p=pop_queue(listqueue);
    }
    return 1;
}

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return bool布尔型
 */
bool isCompleteTree(struct TreeNode* root ) {
    // write code here
    int i=cengxu_queue(root);
    //printf("--%d\n",i);
    return (i==1)? true:false;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
frutiger:逆天,我家就安阳的,这hr咋能说3k的,你送外卖不比这工资高得多?还说大厂来的6k,打发叫花子的呢?这hr是怎么做到说昧良心的话的
找工作时遇到的神仙HR
点赞 评论 收藏
分享
06-15 18:44
黄淮学院 Java
Lynn012:如果是居民楼还是算了吧,看着有点野呢
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务