【代码随想录】【算法训练营】【第17天】 [110]平衡二叉树 [257]二叉树的所有路径 [404]左叶子之和

news2024/11/22 12:00:02

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 17,又是一个令人愉快的周五~

题目详情

[110] 平衡二叉树

题目描述

110 平衡二叉树
110 平衡二叉树

解题思路

前提:平衡二叉树:左右子树高度差不超过1,
思路:从平衡二叉树定义上,可以看出判断平衡二叉树的方法是后序遍历各个结点高度差。
重点:平衡二叉树的判断。

代码实现

C语言
后序遍历计算高度, 递归
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int maxFun(int a, int b)
{
    return (a > b) ? a : b;
}

int absFun(int a, int b)
{
    return (a > b) ? (a - b) : (b - a);
}

int countHight(struct TreeNode *root)
{
    if (root == NULL)
    {
        return 0;
    }
    // 计算左右子树高度
    int leftHight = countHight(root->left);
    if (leftHight < 0)
    {
        return -1;
    }
    int rightHight = countHight(root->right);
    if (rightHight < 0)
    {
        return -1;
    }
    // 判断左右子树是否为平衡二叉树
    if (abs(leftHight - rightHight) > 1)
    {
        return -1;
    }
    return 1 + maxFun(leftHight, rightHight);
}

bool isBalanced(struct TreeNode* root) {
    return (countHight(root) < 0) ? false : true;
}

[257] 二叉树的所有路径

题目描述

257 二叉树的所有路径
257 二叉树的所有路径

解题思路

前提:二叉树的路径,就是从根节点到叶子结点的路径
思路:前序遍历
重点:递归回溯过程中的结点路径的保存。

代码实现

C语言
先序遍历 递归回溯 + sprintf
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

// 先序遍历
void travesal(struct TreeNode *root, char **result, int *returnSize, int *nums, int idx)
{
    if (root == NULL)
    {
        return ;
    }
    // 中
    nums[idx++] = root->val;
    if ((root->left == NULL) && (root->right == NULL))
    {
        // 遍历到叶子结点,输出路径
        (*returnSize)++;
        char *path = (char *)malloc(sizeof(char) * 1001);
        int len = 0;
        for (int i = 0; i < idx; i++)
        {
            if (i != (idx - 1))
            {
                len += sprintf(path + len, "%d->", nums[i]);
            }
            else
            {
                len += sprintf(path + len, "%d", nums[i]);
            }
        }
        result[(*returnSize) - 1] = path;
    }
    else
    {
        // 未遍历到有叶子结点,继续向子节点遍历
        // 左
        travesal(root->left, result, returnSize, nums, idx);
        // 右
        travesal(root->right, result, returnSize, nums, idx);
    }
    return ;
}

char** binaryTreePaths(struct TreeNode* root, int* returnSize) {
    *returnSize = 0;
    char **result = (char **)malloc(sizeof(char *) * 1001);
    int nums[1001];
    int idx = 0;
    travesal(root, result, returnSize, nums, idx);
    return result;
}

[404] 左叶子之和

题目描述

404 左叶子之和
404 左叶子之和

解题思路

前提:所求为左叶子结点的值的和
思路:遍历结点,找到所有叶子结点,且为左结点。
重点:左叶子结点的父节点,可能是右结点。

代码实现

C语言
先序,递归:标识左右结点
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int travesal(struct TreeNode *node, bool isLeft)
{
    int leftSum = 0;
    if (node == NULL)
    {
        return 0;
    }
    // 叶子结点的判断
    if ((node->left == NULL) && (node->right == NULL))
    {
        if (isLeft == true)
        {
            leftSum =  node->val;
        }
    }
    // 非叶子结点
    // 左
    leftSum += travesal(node->left, true);
    // 右
    leftSum += travesal(node->right, false);
    return leftSum;
}

int sumOfLeftLeaves(struct TreeNode* root){
    return travesal(root, false);
}
递归: 通过父节点判断是否为左叶子结点
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

int travesal(struct TreeNode *node)
{
    int leftSum = 0;
    int rightSum = 0;
    if ((node == NULL) || ((node->left == NULL) && (node->right == NULL)))
    {
        return 0;
    }
    // 判断是否为左叶子结点,通过父节点实现判断
    if ((node->left != NULL) && (node->left->left == NULL) && (node->left->right == NULL))
    {
        leftSum = node->left->val;
    }
    else
    {
        // 非左叶子结点
        //左
        leftSum = travesal(node->left);
    }
    //右
    rightSum = travesal(node->right);
    return leftSum + rightSum;
}

int sumOfLeftLeaves(struct TreeNode* root){
    return travesal(root);
}

今日收获

  1. 平衡二叉树的判断;
  2. 二叉树路径的输出。

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

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

相关文章

高性能推理框架漫谈

传统模型分布式推理框架 Tensorflow servingPytorch ServingTriton Server 大语言模型的推理框架 其中&#xff0c; VLLM 后端接入了Ray 框架&#xff0c; 作为调度请求的分发处理&#xff1b;除此之外&#xff0c;还包括Nvidia 最新推出的TensorRT-LLM&#xff0c; 增加了对…

开放式耳机怎么选择!教你几招!2024开放式蓝牙耳机推荐

在面对市场上琳琅满目的开放式耳机时&#xff0c;许多用户可能会感到难以抉择。作为一名开放式耳机的爱好者&#xff0c;我根据自己的实际使用体验&#xff0c;整理了一些我认为值得推荐的开放式耳机&#xff0c;希望能为正在寻找合适耳机的朋友们提供一些参考和帮助。我将为大…

【真实项目中收获的提升】- 前后端联调

场景 小型项目前后端联调&#xff0c;不需要部署到sit或uat环境下。 解决方法 后端部署frp服务 下载frp软件 配置frpc.ini文件&#xff0c;先把文件设置可编辑(可同时配置多个 例如下面的chz 上面打码的是frp服务器地址) 然后起start.bat 其实就是执行frpc -c frpc.ini命令…

前端 CSS 经典:元素倒影

前言&#xff1a;好看的元素倒影&#xff0c;可以通过-webkit-box-reflect 实现。但有兼容问题&#xff0c;必须是 webkit 内核的浏览器&#xff0c;不然没效果。但是好看啊。 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"&g…

使用第三方的PyCharm开发工具

目录 PyCharm下载 PyCharm安装 运行PyCharm 创建工程目录 编写“hello world”程序 在同一个工程下创建多个程序文件 运行程序的多种方法 保存程序 关闭程序或工程 删除程序 打开最近的工程 调试断点 熟悉PyCharm开发环境 设置Python解析器 输出彩色控制台文字及…

【C语言】实现贪吃蛇--项目实践(超详细)

前言&#xff1a; 贪吃蛇游戏大家都玩过吧&#xff1f;这次我们要用C语言来亲手制作一个&#xff01;这个项目不仅能让我们复习C语言的知识&#xff0c;还能了解游戏是怎么一步步做出来的。我们会一起完成蛇的移动、食物的生成&#xff0c;还有碰撞检测等有趣的部分。准备好了…

代码随想录——找树左下角的值(Leetcode513)

题目链接 层序遍历 思路&#xff1a;使用层序遍历&#xff0c;记录每一行 i 0 的元素&#xff0c;就可以找到树左下角的值 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}*…

el-table 组件实现 “合并单元格 + N行数据小计” 功能

目录 需求 - 要实现的效果初始代码代码升级&#xff08;可供多个表格使用&#xff09;CommonTable.vue 子组件 使用子组件1 - 父组件 - 图1~图3使用效果展示 使用子组件2 - 父组件 - 图4使用效果展示 注意【代码优化 - 解决bug】 需求 - 要实现的效果 父组件中 info 数据示例 …

【vue部署】Apache部署vue项目

Apache部署vue项目 Apache 下载安装(windows)1. 下载2. 安装3. 启动服务 vue 部署配置1. 基础配置2. 解决页面刷新问题 Apache 下载安装(windows) 1. 下载 Apache 2.4.59 下载地址&#xff1a;httpd-2.4.59-240404-win64-VS17.zip Visual C Redistributable for Visual Studi…

海山数据库(He3DB)从方法到实践,构建以场景为中心的体验管理体系

编者按&#xff1a;体验优化的过程中设计师经常会遇到几个阶段&#xff0c;发现问题、定义问题、优化问题、查看反馈&#xff0c;但在产品快速迭代的过程中&#xff0c;体验的问题经常被归类到“不紧急”需求中&#xff0c;并逐步转为长尾问题&#xff0c;这些不被重视的问题聚…

AI在线免费音乐生成工具:suno、udio、stableaudio

文生音乐 1、suno https://app.suno.ai/ 2、udio https://www.udio.com/ 3、stableaudio https://stableaudio.com/live https://www.stableaudio.com/?utm_campaignstableaudio_promo&utm_mediumcta_button&utm_sourcestability_ai 4、其他MusicGen https://…

2024 年 电工杯(A题)大学生数学建模挑战赛 | 园区微电网风光储协调| 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 CS团队倾注了大量时间和心血&#xff0c;深入挖掘解决方案。通…

智慧校园的运作加速学校现代化

智慧校园的建造使师生的学校日子愈加便利&#xff0c;学校办公现代化&#xff0c;整个学校充满了生机与活力。其间智慧校园带来的不只是大环境的改变&#xff0c;也为教育教育带来了一种新的形式。我们知道智慧校园是依据信息化的互联网技能&#xff0c;这些技能运用于学校后让…

linux系统CPU持续飙高的排查方法

目录 前言&#xff1a; 1、查看系统cpu使用情况 2、找出占用cpu高的进程 3、进一步分析进程占用的原因&#xff01;&#xff01;&#xff01; 4、解决办法 前言&#xff1a; 如果一台服务器&#xff0c;它的cpu使用率一直处于一个高峰值&#xff0c;此时服务器可能导致无…

vue3中在elementplus多行表格中渲染多图数组中首图的显示问题,无法正常显示图片,作用域插槽写法问题

背景 在vue3中使用elementplus的el-table组件的时候&#xff0c;此时我在vue生命周期中挂载时获取了到服务器了数据&#xff0c;这个数据是一个多个对象的数组&#xff0c;各个对象又包括了图片数组&#xff0c;此时我想在表格上的每一行渲染图片的首图&#xff0c;也就是下标为…

设计系统采购与安装:乙级资质申请的技术准备

在设计系统采购与安装方面&#xff0c;为乙级资质申请所做的技术准备涉及多个方面。以下是一些关键的技术准备事项&#xff1a; 明确技术需求&#xff1a;首先&#xff0c;需要明确乙级资质申请所需的技术系统类型和规格。这可能包括但不限于设计软件、工程管理系统、项目管理系…

【webrtc】m98:Call的创建及Call对音频接收处理

call中多個流共享相同的辅助组件 这几个是与外部共用的 线程传输send控制module 线程任务队列工厂call的辅助组件中各种统计以及接收测的cc是自己创建的 call自己的多个辅助组件是外部传递来的 call 创建多个接收流 这里用一个set 来保存所有指针,并没有要map的意思:

手艺人百度百科怎么创建

创建手艺人百度百科的过程与创建其他类型人物百度百科类似&#xff0c;都需要遵循一定的步骤和注意事项。以下是伯乐网络传媒pouquan整理的手艺人百度百科创建指南&#xff1a; 创建前的准备工作 确定词条名称&#xff1a;手艺人百度百科的词条名称应直接使用手工艺人的姓名。…

智慧教室课堂-专注度及考试作弊系统、课堂动态点名,情绪识别、表情识别和人脸识别结合

课堂专注度分析&#xff1a; 课堂专注度表情识别 作弊检测&#xff1a; 关键点计算方法 转头(probe)低头(peep)传递物品(passing) 侧面的传递物品识别 逻辑回归关键点 使用&#xff1a; 运行setup.py安装必要内容 python setup.py build develop 运行demo_inference.py 将…

uniappx 获取设备唯一标识(OAID、AAID、AndroidID、IMEI等) Ba-IdCode-U

简介&#xff08;下载地址&#xff09; Ba-IdCode-U 是一款可以获取国内各大手机厂商 OAID&#xff08;开放匿名设备标识&#xff09;及海外手机平台 AAID&#xff08;安卓广告标识&#xff09;的uniapp插件。另外也支持获取 IMEI/MEID、AndroidID、WidevineID、PseudoID、GUI…