代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和 [二叉树篇]

news2024/11/25 4:37:49

代码随想录算法训练营第十七天

  • LeetCode 110.平衡二叉树
    • 题目描述
    • 思路
    • 参考代码
  • LeetCode 257. 二叉树的所有路径
    • 题目描述
    • 思路
    • 参考代码
  • LeetCode 404.左叶子之和
    • 题目描述
    • 思路
    • 参考代码

LeetCode 110.平衡二叉树

题目链接:110.平衡二叉树
文章讲解:代码随想录#110.平衡二叉树
视频讲解:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树

题目描述

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例1
在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:true

示例2

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例3

输入:root = []
输出:true

提示

  • 树中的节点数在范围 [0, 5000] 内
  • -10^4 <= Node.val <= 10^4

思路

这道题的关键是每个节点 的左右两个子树的高度差的绝对值不超过1。
可以通过后序遍历来计算每个节点的左右子树的高度(该节点到叶子节点),如果超过1说明不是平衡二叉树。
具体思路可以看代码随想录。

参考代码

int getHeight(struct TreeNode *node)
{
    if (node == NULL)
        return 0; // 当遇到空节点时终止,返回0
    
    int lcnt = getHeight(node->left); // 处理左子树
    if (lcnt == -1) // 如果左子树不是平衡二叉树,则直接返回-1
        return -1;
    int rcnt = getHeight(node->right); // 处理右子树
    if (rcnt == -1) // 如果右子树不是平衡二叉树,则直接返回-1
        return -1; 
    
    if (abs(lcnt - rcnt) > 1) { // 处理中节点
    	// 如果左右节点高度超过1,说明以中节点为根节点的二叉树不是平衡二叉树
        return -1; 
    }
    int depth = lcnt > rcnt ? lcnt : rcnt;
    return 1 + depth;

}
bool isBalanced(struct TreeNode* root) {
    if (root == NULL)
        return true;
    if (getHeight(root) == -1)
        return false;
    return true;
}

LeetCode 257. 二叉树的所有路径

题目链接:257. 二叉树的所有路径
文章讲解:代码随想录#257. 二叉树的所有路径
视频讲解:递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径

题目描述

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例1
在这里插入图片描述

输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]

示例2

输入:root = [1]
输出:[“1”]

提示

  • 树中节点的数目在范围 [1, 100] 内
  • -100 <= Node.val <= 100

思路

本题需要使用递归结合回溯对节点进行前序遍历。

参考代码

int cnt;
typedef struct {
    int index;
    int num[100];
}Stack;

void traversal(struct TreeNode *node, Stack *stack, char **res)
{
    stack->num[stack->index] = node->val; // 将中节点的数值添加到stack中
    if (node->left == NULL && node->right == NULL) { // 当遍历到叶子节点时输出
        int len = 0;
        char ch[10000] = {0};
        for (int i = 0; i <= stack->index; i++) {
            char s[5] = {0};
            sprintf(s, "%d", stack->num[i]);
            len += strlen(s);            
            strcat(ch, s);
            if (i < stack->index) {
                len += 2;
                strcat(ch, "->"); 
            }
        }
        ch[len++] = '\0';
        res[cnt] = (char*)malloc(len * sizeof(char));
        strcpy(res[cnt++], ch);
        return;
    }

    if (node->left) { // 处理左节点
        stack->index++;
        traversal(node->left, stack, res);
        stack->index--; // 回溯
    }
    if (node->right) { // 处理右节点
        stack->index++;
        traversal(node->right, stack, res);
        stack->index--; // 回溯
    }
}

char** binaryTreePaths(struct TreeNode* root, int* returnSize) {
    if (root == NULL) return NULL;
    cnt = 0;
    char **res = (char **)malloc(100*sizeof(char*));
    Stack stack = {0};
    traversal(root, &stack, res);
    *returnSize = cnt;
    return res;
}

LeetCode 404.左叶子之和

题目链接:404.左叶子之和
文章讲解:代码随想录#404.左叶子之和数
视频讲解:二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和

题目描述

给定二叉树的根节点 root ,返回所有左叶子之和。

示例1
在这里插入图片描述

输入:root = [3,9,20,null,null,15,7]
输出:24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

示例2

输入:root = [1]
输出:0

提示

  • 节点数在 [1, 1000] 范围内
  • -1000 <= Node.val <= 1000

思路

如何确定一个节点是左叶子?
如果一个节点的左孩子节点不为空,并且左孩子节点它的左右孩子节点都为空,则这个节点的左孩子节点为左叶子节点。
也就是说,无法判断当前节点是不是左叶子,需要通过该节点的父节点来判断其父节点的左孩子是不是左叶子节点。

参考代码

int sumOfLeftLeaves(struct TreeNode* root){
    if (root == NULL) return 0;
    int val = 0;
    if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) {
        val = root->left->val; // 找到左叶子节点
    }
    return val + sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);
}

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

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

相关文章

可转债和股票有哪些区别?可转债和股票哪个好?

可转债&#xff0c;全称可转换债券&#xff0c;指的是持有者可以在特定时期、按特定条件&#xff0c;将其转换为特定数量的另一种证券的债券。这种债券可以转换成公司的普通股票。 如果债券持有人看好发债公司股票增值潜力&#xff0c;在宽限期之后可以行使转换权&#xff0c;…

SOLIDWORKS PDM—中央卡列表

SOLIDWORKS产品数据管理 (PDM) 解决方案可帮助您控制设计数据&#xff0c;并且从本质上改进您的团队就产品开发进行管理和协作的方式。使用 SOLIDWORKS PDM Professional&#xff0c;您的团队能够&#xff1a;1. 安全地存储和索引设计数据以实现快速检索&#xff1b;2. 打消关于…

条码扫描器

介绍 条码扫描器&#xff0c;又称为条码阅读器、条码扫描枪、条形码扫描器、条形码扫描枪及条形码阅读器。它是用于读取条码所包含信息的阅读设备&#xff0c;利用光学原理&#xff0c;把条形码的内容解码后通过数据线或者无线的方式传输到电脑或者别的设备。广泛应用于超市、物…

2024年腾讯云4核8G12M轻量应用服务器测评,2月更新

4核8G服务器支持多少人同时在线访问&#xff1f;阿腾云的4核8G服务器可以支持20个访客同时访问&#xff0c;关于4核8G服务器承载量并发数qps计算测评&#xff0c;云服务器上运行程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&…

搜维尔科技:分析OptiTrack光学动作捕捉应用领域!

虚拟制作 当今虚拟制作阶段低延迟、超精确摄像机跟踪的事实上的标准。 用于运动科学的 OptiTrack OptiTrack 系统提供世界领先的测量精度和简单易用的工作流程&#xff0c;为研究人员和生物力学师的研究提供理想的 3D 跟踪数据。对所有主要数字测力台、EMG 和模拟设备的本机即…

Kernelized Correlation Filters KCF算法原理详解(阅读笔记)(待补充)

KCF 目录 KCF预备知识1. 岭回归2. 循环移位和循环矩阵3. 傅里叶对角化4. 方向梯度直方图&#xff08;HOG&#xff09; 正文1. 线性回归1.1. 岭回归1.2. 基于循环矩阵获取正负样本1.3. 基于傅里叶对角化的求解 2. 使用非线性回归对模型进行训练2.1. 应用kernel-trick的非线性模型…

机构如何搭建一个在线课程教学平台?

随着数字化教育的兴起&#xff0c;越来越多的教育机构开始考虑建立自己的在线课程教学平台。这一趋势不仅顺应了时代的发展&#xff0c;而且为教育行业带来了诸多便利和优势。构建一个在线教学平台可以帮助机构拓宽服务范围、提升教学质量、增强学生体验&#xff0c;并且能够有…

【机器学习】数据清洗——基于Pandas库的方法删除重复点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

《Solidity 简易速速上手小册》第6章:优化 Gas 消耗和性能(2024 最新版)

文章目录 6.1 理解 Gas 和交易成本6.1.1 基础知识解析更深入的理解优化的关键点 6.1.2 重点案例&#xff1a;优化合约以降低 Gas 成本案例 Demo&#xff1a;创建一个经济高效的财务管理合约案例代码FinancialManagementContract.sol 测试和验证拓展功能 6.1.3 拓展案例 1&#…

【plt.pie绘制饼图】:从入门到精通,只需一篇文章!【Matplotlib可视化】

【&#x1f4ca;plt.pie绘制饼图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib可视化】&#xff01; 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f3a8; 一、饼图初探&#xff1a;基本概念与用途&#x1f4a…

软件测试系列:移动端安卓APP测试必备之ADB命令 (二)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

AD24-Objects元素、特殊复制粘贴、多根走线、自动布线、泪滴

一、Objects元素的隐藏与显示 1、Altium Transparent 2D与Altium Standard 2D的区别 1) Altium Transparent 2D 2) Altium Standard 2D 二、特殊复制粘贴 1、如何把元件带位号、带网络从当前PCB调用到另外的PCB中 三、多根走线与多根走线设置 四、Active Route 的自动布线辅助…

RSA加密,解密,加签及验签

目录 1.说明 2.加密和加签的区别 3.后端加密&#xff0c;解密&#xff0c;加签及验签示例 4.前端加密&#xff0c;解密&#xff0c;加签及验签示例 5.前端加密&#xff0c;后端解密&#xff0c;前端加签&#xff0c;后端验签 6.注意事项 1.说明 RSA算法是一种非对称加密…

压缩感知——革新数据采集的科学魔法

引言&#xff1a; 在数字时代&#xff0c;数据以及数据的收集和处理无处不在。压缩感知(Compressed Sensing, CS)是一种新兴的数学框架&#xff0c;它挑战了我们传统上对数据采集和压缩的看法&#xff0c;给医学图像、天文观测、环境监测等领域带来了颠覆性的影响。但到底什么…

白话微机:5.解释串行接口以及一些考研面试问题

一. 前言&#xff08;回顾世界观&#xff09; 很久很久以前&#xff0c;有这样一个世界&#xff0c;这个世界有着现实世界一样的元素&#xff1a;那里的人又有一个别的名字叫做“数据”&#xff0c;人有0有1&#xff1b;人们也有住房&#xff0c;这些住房在这个世界叫做“存储器…

Apache DolphinScheduler中ZooKeeperCDH不兼容问题的解决方案

背景 看到Apache DolphinScheduler社区群有很多用户反馈和讨论这块问题&#xff0c;针对不兼容的问题&#xff0c;不仅需要自己重新编译各一个新包&#xff0c;而且因为默认是使用zk-3.8的配置&#xff0c;所以会出现不兼容问题。使用zk-3.4配置即可适配3.4.x 解决办法&#…

ffmpeg for android编译全过程与遇到的问题

编译前准备 编译环境&#xff1a;Ubuntu16&#xff0c;可自行下载VMWare最新版并百度永久许可证或在服务器上安装Ubuntu ffmpeg源码&#xff1a;ffmpeg4.2.2 NDK下载&#xff1a;Android NDK r21e 有条件的最好还是在Liunx平台下编译吧&#xff0c;Windows平台下编译坑更多…

使用openeuler 22.03替代CentOS 7.9,建立虚拟机详细步骤

进入浏览器搜索网址下载openeuler 22.03镜像文件 https://mirrors.huaweicloud.com/openeuler/openEuler-22.03-LTS-SP3/ISO/x86_64/openEuler-22.03-LTS-SP3-x86_64-dvd.iso 打开VMware Workstation新建一个虚拟机&#xff1a; 自定义虚拟机位置 加入下载好的openeuler镜像文件…

算法刷题:最大连续1的个数

最大连续1的个数 .题目链接题目详情题目解析算法原理滑动窗口定义指针和其他变量进窗口判断出窗口结束更新结果 我的答案 . 题目链接 最大连续1的个数 题目详情 题目解析 将题目转化为求一个最长的字串,字串中0的个数不能大于k个 算法原理 滑动窗口 这道题采用滑动窗口的…

33、IO/标准IO对图片操作练习及文件IO相关练习20240219

一、使用fread和fwrite完成两个图片文件的拷贝&#xff08;标准IO&#xff09;。 代码&#xff1a; #include<myhead.h>int main(int argc, const char *argv[]) {FILE *srcfpNULL;FILE *destfpNULL;if((srcfpfopen("./hongfeng.bmp","r"))NULL ||…