【每日刷题】Day49

【每日刷题】Day49

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 110. 平衡二叉树 - 力扣(LeetCode)

2. 501. 二叉搜索树中的众数 - 力扣(LeetCode)

3. 637. 二叉树的层平均值 - 力扣(LeetCode)

1. 110. 平衡二叉树 - 力扣(LeetCode)

//思路:平衡二叉树:对于树中每个结点都满足 左、右子树深度差值不超过1。因此我们递归遍历树的每一个结点,判断每一个结点处是否满足平衡二叉树,只要有一个不满足直接return false。

int TreeHigh(struct TreeNode* root)

{

    if(root==NULL)

        return 0;

    int HighLeft = TreeHigh(root->left);

    int HighRight = TreeHigh(root->right);

    return 1+(HighLeft>HighRight?HighLeft:HighRight);

}

bool isBalanced(struct TreeNode* root)

{

    if(root==NULL)

        return true;

    int HighLeft = TreeHigh(root->left);

    int HighRight = TreeHigh(root->right);

    int tmp = abs(HighLeft-HighRight);

    if(tmp>1)

        return false;

    return isBalanced(root->left)&&isBalanced(root->right);

}

2. 501. 二叉搜索树中的众数 - 力扣(LeetCode)

//思路:哈希表。本题很容易想到使用哈希表存储每个数出现的次数,找出出现次数最多的数。但因为数中的值可能为负数,因此我们需要对哈希表的键进行调整。

void FindMode(struct TreeNode* root,int* arr)

{

    if(root==NULL)

        return;

    arr[root->val+100000]+=1;//将所有负数转变为正数

    FindMode(root->left,arr);

    FindMode(root->right,arr);

}

int* findMode(struct TreeNode* root, int* returnSize)

{

    int hash[200001] = {0};

    FindMode(root,hash);

    int max = 0;

    int* ans = (int*)malloc(sizeof(int)*10000);

    int size = 0;

    for(int i = 0;i<200001;i++)

    {

        max = max>hash[i]?max:hash[i];

    }

    for(int i = 0;i<200001;i++)

    {

        if(hash[i]==max)

        {

            ans[size++] = i-100000;//将原为负数的值更改回去

        }

    }

    *returnSize = size;

    return ans;

}

3. 637. 二叉树的层平均值 - 力扣(LeetCode)

//思路:使用一个数组存储二叉树每一层结点个数,随后对二叉树进行层序遍历,每次根据每层结点个数将结点的值进行累加,然后除去当前层的结点个数,从而算出每层的平均值,存储进答案数组中返回。注:本题思路需要先明白二叉树层序遍历的实现。

typedef struct TreeNode BT;

typedef struct TreeNode* QDataType;


 

//队列节点

typedef struct listnode

{

    QDataType val;

    struct listnode* next;

}LN;

//队列头尾指针

typedef struct Queque

{

    LN* phead;

    LN* ptail;

    int size;

}QE;


 

//队列初始化

void QueInit(QE* qe)

{

    assert(qe);

    qe->phead = NULL;

    qe->ptail = NULL;

    qe->size = 0;

}


 

//入列

void QuePush(QE* qe, QDataType x)

{

    assert(qe);

    LN* newnode = (LN*)malloc(sizeof(LN));

    if (newnode == NULL)

    {

        perror("malloc:");

        exit(-1);

    }

    newnode->next = NULL;

    newnode->val = x;

    if (qe->phead == NULL)

    {

        qe->phead = qe->ptail = newnode;

    }

    else

    {

        qe->ptail->next = newnode;

        qe->ptail = qe->ptail->next;

    }

    qe->size++;

}


 

//出列

void QuePop(QE* qe)

{

    assert(qe);

    assert(qe->phead != NULL);

    assert(qe->size > 0);

    LN* tmp = qe->phead->next;

    free(qe->phead);

    qe->phead = tmp;

    qe->size--;

}


 

//获取列头元素

QDataType QueGetHead(QE* qe)

{

    assert(qe);

    assert(qe->phead != NULL);

    return qe->phead->val;

}


 

//判断队列是否为空

bool QueEmpty(QE* qe)

{

    assert(qe);

    return qe->size == 0;

}


 

//层序遍历二叉树计算平均值(队列实现层序遍历)

void SequenceTraverse(BT* root,int* arr,int size,double* ans,int* count)

{

    QE q;

    QueInit(&q);

    if (root)

        QuePush(&q, root);

    int i = 0;

    while (i<size)

    {

        double tmp = 0;

        int n = arr[i];//记录当前层的节点数

        while(n)

        {

            QDataType front = QueGetHead(&q);//获取队头元素

            QuePop(&q);//将队头元素出列

            if(front)

                tmp+=front->val;//累加

            if(front)

            {

                QuePush(&q, front->left);//继续将当前结点的left和right结点入队列

                QuePush(&q, front->right);

                n--;

            }

        }

        tmp/=arr[i];//计算平均值

        ans[(*count)++] = tmp;

        i++;

    }

}

//求二叉树第K层结点个数

int BinaryTreeKSize(BT* root,int k)

{

    if (root == NULL)

        return 0;

    if (k == 0)

        return 1;

    return BinaryTreeKSize(root->left, k - 1) + BinaryTreeKSize(root->right, k - 1);

}

double* averageOfLevels(struct TreeNode* root, int* returnSize)

{

    int ksize[10000] = {0};

    int size = 0;

    do

    {

        int ret = BinaryTreeKSize(root,size);

        ksize[size++] = ret;

    }while(ksize[size-1]);//将二叉树每层节点数存储起来

    double* ans = (double*)malloc(sizeof(double)*10000);

    int count = 0;

    SequenceTraverse(root,ksize,size,ans,&count);

    *returnSize = count-1;

    return ans;

}

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

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

相关文章

基于YOLOv8的车牌检测与识别(CCPD2020数据集)

前言 本篇博客主要记录在autodl服务器中基于yolov8实现车牌检测与识别&#xff0c;以下记录实现全过程~ yolov8源码&#xff1a;GitHub - ultralytics/ultralytics: NEW - YOLOv8 &#x1f680; in PyTorch > ONNX > OpenVINO > CoreML > TFLite 一、环境配置 …

python学习:基础语句

目录 条件语句 循环语句 for 循环 while 循环 break continue 条件语句 Python提供了 if、elif、else 来进行逻辑判断。格式如下&#xff1a; Pythonif 判断条件1: 执行语句1... elif 判断条件2: 执行语句2... elif 判断条件3: 执行语句3... else: 执行语句4…

C# 集合(六) —— 自定义集合Collection类

总目录 C# 语法总目录 集合六 Collection 1. 自定义集合Collection其他 1. 自定义集合Collection Collection可以对添加删除元素或者添加删除属性进行事件响应。 class Person {public string name;public int age;public Person(){this.name "";this.age 0;}pub…

ubuntu 硬盘转移

我插了两个 文件系统&#xff1a; ubuntu 硬盘转移&#xff1a; sudo dd if/dev/sdX1 of/dev/sdY1 bs128K convnoerror,sync statusprogressdd 的意思是DiskToDisk&#xff0c;if 是输入文件系统&#xff0c;of是输出文件系统。 bs是每次传递的数据大小。 注意&#xff1a;接…

mysql-主从同步原理

AB复制(重点) 一、什么是主从复制? 1、主从同步也叫AB复制&#xff0c;是用来建立一个和主数据库完全一样的数据库环境&#xff0c;称为从数据库&#xff1b;主数据库一般是准实时的业务数据库。 2、主从复制的作用 1.做数据的热备&#xff0c;作为后备数据库&#xff0c;…

如何用MySQL的SQL语句来读写硬盘目录文件

1.先确保创建表&#xff0c;例如起名Temp CREATE TABLE temp ( id int(11) NOT NULL AUTO_INCREMENT, image mediumblob, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT7 DEFAULT CHARSETutf8; 注意这里的image字段用mediumblog&#xff0c;就可以避免出现data too …

27【Aseprite 作图】盆栽——拆解

1 橘子画法拆解 (1)浅色3 1 0;深色0 2 3 就可以构成一个橘子 (2)浅色 2 1;深色1 0 (小个橘子) (3)浅色 2 1 0;深色1 2 3 2 树根部分 (1)底部画一条横线 (2)上一行 左空2 右空1 【代表底部重心先在右】 (3)再上一行,左空1,右空1 (4)再上一行,左突出1,…

省市区(输入code) 转相应省市区工具类(两种方式)

方式一 通过调用接口&#xff08;时间高达1s&#xff09; package cn.iocoder.yudao.module.supplier.utils;import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element;import java.io.BufferedReader; import java.io.InputStreamReader; i…

Java 泛型基础

目录 1. 为什么使用泛型 2. 泛型的使用方式 2.1. 泛型类 2.2. 泛型接口 2.3. 泛型方法 3. 泛型涉及的符号 3.1. 类型通配符"?" 3.2. 占位符 T/K/V/E 3.3. 占位符T和通配符&#xff1f;的区别。 4. 泛型不变性 5. 泛型编译时擦除 1. 为什么使用泛型 Java 为…

基于深度学习的入侵检测系统综述文献概述

好长时间不发博客了&#xff0c;不是因为我摆烂了&#xff0c;是我换研究方向了&#xff0c;以后我就要搞科研了。使用博客记录我的科研故事&#xff0c;邀诸君共同见证我的科研之路。 1、研究方向的背景是什么&#xff1f; &#xff08;1&#xff09;互联网发展迅速&#xff…

Android firebase消息推送集成 FCM消息处理

FirebaseMessagingService 是 Firebase Cloud Messaging (FCM) 提供的一个服务&#xff0c;用于处理来自 Firebase 服务器的消息。它有几个关键的方法&#xff0c;你提到的 onMessageReceived、doRemoteMessage 和 handleIntent 各有不同的用途。下面逐一解释这些方法的作用和用…

在 C++ 中,p->name 和 p.name 的效果并不相同。它们用于不同的情况,取决于你是否通过指针访问结构体成员。

p->name&#xff1a;这是指针访问运算符&#xff08;箭头运算符&#xff09;。当 p 是一个指向结构体的指针时&#xff0c;用 p->name 来访问结构体的成员。 student* p &stu; // p 是一个指向 student 类型的指针 cout << p->name << endl; // 通过…

基于ssm的蛋糕商城系统java项目jsp项目javaweb

文章目录 蛋糕商城系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 蛋糕商城系统 一、项目演示 蛋糕商城管理系统 二、项目介绍 系统角色 : 管理员、用户 一&#xff0c;管理员 管理员有…

PICO VR眼镜定制播放器使用说明文档videoplayerlib-ToB.apk

安装高级定制播放器 高级定制播放器下载地址:https://download.csdn.net/download/ahphong/89360454 仅限用于PICO G2、G3、G4、NEO系列VR眼镜上使用, 用途:用于第三方APP(开发者)调用定制播放器播放2D、3D、180、360全景视频。 VR眼镜系统请升级到最新版,可在官网下载,…

Mixed-precision计算原理(FP32+FP16)

原文&#xff1a; https://lightning.ai/pages/community/tutorial/accelerating-large-language-models-with-mixed-precision-techniques/ This approach allows for efficient training while maintaining the accuracy and stability of the neural network. In more det…

【排序算法】选择排序以及需要注意的问题

选择排序的基本思想&#xff1a;每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 第一种实现方法&#xff1a; void SelectSort(int* arr, int n) {for (int j 0…

【kubernetes】探索k8s集群中金丝雀发布后续 + 声明式资源管理yaml

目录 一、K8S常见的发布方式 1.1蓝绿发布 1.2灰度发布&#xff08;金丝雀发布&#xff09; 1.3滚动发布 二、金丝雀发布 三、声明式管理方法 3.1YAML 语法格式 3.1.1查看 api 资源版本标签 3.1.2查看资源简写 3.2YAML文件详解 3.2.1Deployment.yaml 3.2.2Pod.yaml …

CSS3特殊属性

特殊属性 will-change will-change 属性用于向浏览器提供提示,表明某个元素或其特定属性在未来极有可能发生变化。这有助于浏览器提前优化相关渲染流程,提升动画或其他动态效果的性能。 element {will-change: auto | <animateable-feature> [, <animateable-feat…

C++系列-C/C++内存管理方式

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” C/C内存分布 在这篇文章开始之前&#xff0c;我们先以一道题目来进行引入&#xff1a; int glovalvar 1; static int staticGlovalvar 1; void Test() {static int staticva…

Java进阶学习笔记27——StringBuilder、StringBuffer

StringBuilder&#xff1a; StringBuilder代表可变字符串对象&#xff0c;相当于一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a; StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;…