leetcode 958.二叉树的完全性检验

news2024/9/25 2:29:41

1.题目要求:

给你一棵二叉树的根节点 root ,请你判断这棵树是否是一棵 完全二叉树 。

在一棵 完全二叉树 中,除了最后一层外,所有层都被完全填满,并且最后一层中的所有节点都尽可能靠左。最后一层(第 h 层)中可以包含 12h 个节点。

 

在这里插入图片描述

2.题目代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
 //创建队列
typedef struct queue{
    struct TreeNode* data;
    struct queue* next;
}queue_t;
//入队
void push(queue_t** head,struct TreeNode* data){
    queue_t* newnode = (queue_t*)malloc(sizeof(queue_t));
    newnode->data = data;
    newnode->next = NULL;
    if(*head == NULL){
        *head = newnode;
        return;
    }
    queue_t* tail = *head;
    while(tail->next != NULL){
        tail = tail->next;
    }
    tail->next = newnode;
}
//出队
struct TreeNode* pop(queue_t** head){
    struct TreeNode* x = (*head)->data;
    (*head) = (*head)->next;
    return x; 
}
bool isCompleteTree(struct TreeNode* root) {
    int node_count = 0;//设置结点个数
    int* level_travel_node = (int*)malloc(sizeof(int) * 200);//记录最后一层的标记数组
    int j = 0;
    int depth = 0;
    queue_t* quence = NULL;
    int count = 1;
    int nextcount =  0;
    int size = 0;
    //层序遍历开始
    push(&quence,root);
    size++;
    node_count++;
    while(size != 0){
            depth++;
            for(int i = 0;i < count;i++){
                struct TreeNode* temp = pop(&quence);
                size--;
                if(temp->left != NULL){
                    push(&quence,temp->left);
                    size++;
                    node_count++;
                    nextcount++;
                }
                if(temp->right != NULL){
                    push(&quence,temp->right);
                    size++;
                    node_count++;
                    nextcount++;
                }
            }
            count = nextcount;
            nextcount = 0;
    }
    //判断结点数,如果节点数为1,则直接返回true
    if(node_count == 1){
        return true;
    }else{
        //如果节点数不为1,则判断结点总数是否符合完全二叉树的结点范围,不符合直接返回false
        if(node_count >= (int)pow(2,depth -1)&&node_count <= ((int)pow(2,depth) - 1)){
            printf("%d ",node_count);
            int depth_t = 0;
            size = 0;
            count = 1;
            int remove_line_count = 0;//记录除最后一行的节点数量
            nextcount = 0;
            push(&quence,root);
            size++;
            remove_line_count++;
            //再次进行层序遍历,一直遍历到倒数第二次位置
            while(size != 0){
                depth_t++;
                //判断是否为倒数第二层 
                if(depth_t != depth - 1){
                    for(int i = 0;i < count;i++){
                        struct TreeNode* temp = pop(&quence);
                        size--;
                        if(temp->left != NULL){
                            push(&quence,temp->left);
                            size++;
                            remove_line_count++;
                            nextcount++;
                        }
                        if(temp->right != NULL){
                            push(&quence,temp->right);
                            size++;
                            remove_line_count++;
                            nextcount++;
                        }
                }
                count = nextcount;
                nextcount = 0;
                }else{
                    //是倒数第二层后,把最后一层的结点进行记录,如果为空为-1,不为空为1
                    for(int i = 0;i < count;i++){
                        struct TreeNode* temp = pop(&quence);
                        size--;
                        if(temp->left != NULL){
                            level_travel_node[j] = 1;
                            j++;
                        }else{
                            level_travel_node[j] = -1;
                            j++;
                        }
                        if(temp->right != NULL){
                            level_travel_node[j] = 1;
                            j++;
                        }else{
                            level_travel_node[j] = -1;
                            j++;
                        }
                    }
                    break;
                }
            }
            //判断除最后一层的结点数量,如果不对,则返回false
            if(remove_line_count != ((int)pow(2,depth - 1) - 1)){
                return false;
            }else{
                int i = 0;
                for(i = 0;i < j;i++){
                    if(level_travel_node[i] == -1){
                        break;
                    }
                }
                //如果-1后的结点有1,则为错,如果不是则为true
                int j_1 = i + 1;
                for(j_1 = i + 1;j_1 < j;j_1++){
                    if(level_travel_node[j_1] == 1){
                        return false;
                    }
                }
                return true;
            }

        }else{
            return false;
        }
    }
}

解题步骤都在代码里了,虽然比较繁琐,但如果大家觉得好的话,可以给个免费的赞吗,谢谢了^ _ ^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1989295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】哈希应用-布隆过滤器

目录 1、布隆过滤器的概念 2、布隆过滤器误判率推导 3、代码实现 3.1 Set 3.2 Test 4、布隆过滤器的删除 5、布隆过滤器的应用 1、布隆过滤器的概念 有⼀些场景下⾯&#xff0c;有⼤量数据需要判断是否存在&#xff0c;⽽这些数据不是整形&#xff0c;那么位图就不能使…

【学习笔记】Day 6

一、进度概述 1、《地震勘探原理》第二章 2、“DenseNet” 周报分享 二、详情 1、《地震勘探原理》第二章 注&#xff1a;本来的打算是逐章整理&#xff0c;但是在听老师指导后&#xff0c;明晰了学习目的。故学习方法更改为侧重 “刷” 。不求一遍全弄懂&#xff0c…

实验8-2-4 使用函数实现字符串部分复制

本题要求编写函数&#xff0c;将输入字符串t中从第m个字符开始的全部字符复制到字符串s中。 函数接口定义&#xff1a; void strmcpy( char *t, int m, char *s );函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度…

[Vue]Vue3从入门到精通-综合案例分析

一.Vue是什么&#xff1a; 概念&#xff1a;Vue是一个用于构建用户界面的渐进式的框架 以下的内容是自里向外的 声明式渲染(Vuejs核心包)组件系统(Vuejs核心包)客户端路由VueRouter大规模状态管理Vuex构建工具Webpack/Vite Vue的两种使用方式&#xff1a; Vue核心包开发-&…

好用高性价比蓝牙耳机有哪些?万人点赞四大高性价比耳机推荐

如今&#xff0c;市面上蓝牙耳机种类繁多&#xff0c;而面对市场上众多百元内的耳机品牌和型号&#xff0c;怎么选才能够选到一款音质好&#xff0c;续航久的蓝牙耳机呢&#xff0c;到底什么样的蓝牙耳机更适合自己&#xff0c;那么好用高性价比蓝牙耳机有哪些&#xff1f;接下…

理解Spring框架2:容器IOC

理解Spring框架2&#xff1a;容器IOC (qq.com)

如何计算UDP校验和

在了解 UDP 校验和的时候&#xff0c;发现资料很少&#xff0c;如果看教材的话&#xff0c;一定看到过下面这两张图&#xff0c;但是又看不懂&#xff0c;加上解释之后也难懂&#xff1a; 本文先说具体怎么算的&#xff0c;再说一些细节&#xff0c;过程中顺带解释一下这两个图…

浅析中国蚁剑的木马加密流量

简介 在蓝帽杯 2022 初赛中&#xff0c;domainhacker 的流量分析题目聚焦于中国蚁剑这款 webshell 管理工具的流量特征。通过对比赛提供的数据包进行解析&#xff0c;本文将深入分析蚁剑在连接木马时产生的加密流量。 公司安全部门&#xff0c;在流量设备中发现了疑似黑客入侵的…

微信小程序开发【从0到1~入门篇4】

如果您没有看我上一篇文章&#xff0c;建议返回阅读&#xff1a; 微信小程序开发【从0到1~入门篇3】 这篇文章进入基础增强阶段&#xff0c;通过对这篇文章的学习&#xff0c;你将学会以下内容 ① 能够创建并引用组件 ⚫ 全局引用、局部引用、usingComponents ② 能够知道如何…

Unity初识

1&#xff1a;下载Unity Hub 下载地址&#xff1a;Unity官方下载_Unity最新版_从Unity Hub下载安装 | Unity中国官网 建议直接使用unity hub因为支持比较全面&#xff0c;适合新手 有中文 管理 编辑器等等功能支持 下载安装不过多介绍 2&#xff1a;Unity Hub汉化 因为我…

Unity Console 窗口输出对齐

起因&#xff1a;做了个工具在console窗口罗列一些信息&#xff0c;基本结构是 [ 文件名 &#xff1a;行号 ]&#xff0c;因为文件&#xff0c;行号长度不一&#xff0c;想要做到如下效果。 初步尝试&#xff0c;用以下方法&#xff1a; string format "{0,-10} …

凯伦股份子公司中标中建八局发展建设分公司年度多项工程集采

近日&#xff0c;凯伦股份旗下全资子公司——苏州凯瑞伦建筑工程有限公司凭借其卓越的专业素养和服务能力&#xff0c;顺利中标中国建筑第八工程局有限公司发展建设分公司-北京分公司2024年度-北京、天津、河北、内蒙等区域防水工程集采。 中国建筑第八工程局有限公司发展建设分…

书生大模型实战营-入门关卡-Linux 前置基础

任务&#xff1a;Tutorial/docs/L0/Linux at camp3 InternLM/Tutorial GitHub 完成&#xff1a;

长在客户审美点上的可视化大屏,大概率就是这个样子。

要想使可视化大屏长在客户审美点上&#xff0c;需要具备以下特征&#xff1a; 布局合理&#xff1a;有良好的整体结构和布局&#xff0c;各个元素之间的关系清晰&#xff0c;避免视觉上的混乱和杂乱无章感。信息展示清晰有序&#xff0c;重点突出&#xff0c;能够让客户快速找…

Granger-因果检验及 Stata 具体操作步骤

目录 一、文献综述 二、理论原理 三、实证模型 四、程序代码及解释 五、代码运行结果 一、文献综述 Granger 因果检验作为一种重要的时间序列分析方法&#xff0c;在众多学科领域中都发挥着关键作用&#xff0c;并引发了广泛的研究和应用。 在宏观经济学领域&#xff0c;学…

探秘C# LINQ元素运算:原理阐释与实践指南

文章目录 一、LINQ元素运算符概述二. ElementAt 和 ElementAtOrDefault三. First 和 FirstOrDefault四. Last 和 LastOrDefault五. Single 和 SingleOrDefault六. Where 和 Select七、实际应用场景示例总结 LINQ&#xff08;Language-Integrated Query&#xff09;是C#中强大且…

Linux基础IO——重定向与文件缓冲区

文章目录 重定向重定向的系统调用C语言中的FILE结构体 文件缓冲区C语言缓冲区 重定向 我们在学习Linux的基本内容时候&#xff0c;知道>> >都可以用来表示重定向&#xff0c;那么重定向的本质是什么呢&#xff0c;其实就是更改了标号为1的文件描述符 1表示标准输出&…

虚实共生:数字孪生技术引领设施农业新未来

在全球人口持续增长和气候变化日益严峻的背景下,设施农业正面临前所未有的挑战和机遇。如何在有限的资源条件下提高作物产量、质量和生产效率,成为困扰农业从业者的核心问题。随着人工智能、物联网和大数据等新兴技术的快速发展,数字化转型为设施农业带来了新的希望。其中,数字…

如何为树莓派添加人工智能超能力!

Raspberry Pi AI 套件价格实惠&#xff0c;安装简单&#xff0c;只要你能找到一个。 Adrian Kingsley-Hughes/ZDNET ZDNET 的关键要点 Raspberry Pi 基金会发布了适用于 Pi 5 的 Raspberry Pi AI 套件&#xff0c;但供应情况并不稳定。在撰写本文时&#xff0c;我在亚马逊和芝…

跟《经济学人》学英文:2024年08月03日这期 What is the point of industry awards?

What is the point of industry awards? Booze, sweat and plexiglass booze&#xff1a;美 [buz] 酒精饮料&#xff1b;烈酒&#xff1b;<俚>喝酒 sweat&#xff1a;英 [swet] 汗水&#xff1b;辛勤劳动 注意发音 plexiglass&#xff1a;美 [pleksɪˌglɑs] 树脂玻…