代码随想录算法训练营:15/60

非科班学习算法day15 | LeetCode110:平衡二叉树 ,Leetcode257:二叉树的所有路径 ,Leetcode404:左叶子之和,Leetcode222:完全二叉树的节点个数 

目录

介绍

一、基础概念补充:

1.平衡二叉树

二、LeetCode题目

1.LeetCode110:平衡二叉树 

题目解析

 2.Leetcode257:二叉树的所有路径 

题目解析

3.Leetcode404:左叶子之和

题目解析

 4.Leetcode222:完全二叉树的节点个数


介绍

包含LC的两道题目,还有相应概念的补充。

相关图解和更多版本:

代码随想录 (programmercarl.com)https://programmercarl.com/#%E6%9C%AC%E7%AB%99%E8%83%8C%E6%99%AF


一、基础概念补充:

1.平衡二叉树

平衡二叉树是一种特殊的二叉树,它在进行插入和删除操作后能自动保持树的高度较小,从而提高查找、插入和删除等操作的效率。平衡二叉树满足以下性质:

  1. 平衡性:任意节点的两个子树的高度差不超过1。
  2. 二叉搜索树性质:对于任意节点,其左子树中所有节点的值小于该节点的值,右子树中所有节点的值大于该节点的值。        

二、LeetCode题目

1.LeetCode110:平衡二叉树 

题目链接:110. 平衡二叉树 - 力扣(LeetCode)

题目解析

       主要的思路是借助于求树的深度,首先想到的就是新建一个辅助函数,求深度的。但是这个时候我就摇摆不定,不知道返回类型用int还是bool,这里最后考量发现,这个函数的主题还是求深度,返回的也是深度,只有当异常的时候会直接返回设定值(-1),这样实现了借用求深度的函数,也处理了两个树分叉之间是否平衡的问题

 c++代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:// 获取左右子树状况int dbs(TreeNode* root) {if (!root)return 0;int left = dbs(root->left);if (left == -1)return -1;int right = dbs(root->right);if (right == -1)return -1;if (abs(left - right) > 1)return -1;elsereturn max(left, right) + 1;}bool isBalanced(TreeNode* root) {if (dbs(root) == -1)return false;return true;}
};

注意点1:这里要在左右向下递归的过程中设置如果识别到异常(-1),即刻返回上一层,将-1这个信息传递回去。

 2.Leetcode257:二叉树的所有路径 

题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)

题目解析

     个人认为隐式的回溯过程反而更好理解,这里借助的就是值传递出现的隐式回溯过程

 C++代码如下: 

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:// 值传递的隐式回溯vector<string> dfs(TreeNode* root, string path, vector<string>& res) {if (!root)return res;path += to_string(root->val);if (!root->left && !root->right) {res.push_back(path);return res;}dfs(root->left, path + "->", res);dfs(root->right, path + "->", res);return res;}vector<string> binaryTreePaths(TreeNode* root) {vector<string> res;string path;return dfs(root, path, res);}
};

3.Leetcode404:左叶子之和

题目链接:404. 左叶子之和 - 力扣(LeetCode)

题目解析

       不管学什么,总会遇到这种蹩脚的题,为了创新而创新。检查是否为题目中要求的左子叶的条件是,左叶子存在,左叶子的左右叶子不存在。本题采用前序或者后序都可以。

C++代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:void dfs(TreeNode* root, int& sum) {// 中止条件if (!root)return;if (root->left && !root->left->left && !root->left->right)sum += root->left->val;dfs(root->left, sum);dfs(root->right, sum);return;}int sumOfLeftLeaves(TreeNode* root) {int sum = 0;dfs(root, sum);return sum;}
};

注意点1:这里采用了模板式的前序遍历,值得注意的式这里的左右子叶递归的过程不需要先检查root->left或者root->right是否为空,因为中止条件就是root为空,已经隐含检查了,加了没毛病,就是会冗余。

 4.Leetcode222:完全二叉树的节点个数

题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)

 题目解析

        需要掌握两种思路,一个是把他当作普通二叉树处理,遇到非空节点就直接计数;另一种是根据完全二叉树的性质,如果搜索部分是满二叉树,返回2^n-1,其中n为层数

,如果不是就计数;这样就退化成了普通二叉树类似的方式处理。

 C++代码如下:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:// 普通二叉树的节点void dfs(TreeNode* root, int& count) {if (!root)return;dfs(root->left, count);dfs(root->right, count);count++;return;}int countNodes(TreeNode* root) {int count = 0;dfs(root, count);return count;}
};

 有返回值且利用性质:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:// 满二叉树求解int depth(TreeNode* root) {if (!root)return 0;int left_depth = 0;int right_depth = 0;// 如果需要向下检索需要再设置一个指针,而不是用原本的root,// 和链表的道理一样,但是和递归不一样,递归没有赋值操作TreeNode* cur_left = root->left;TreeNode* cur_right = root->right;while (cur_left) {cur_left = cur_left->left;left_depth++;}while (cur_right) {cur_right = cur_right->right;right_depth++;}if (left_depth == right_depth)return (2 << left_depth) - 1;int left = depth(root->left);int right = depth(root->right);return left + right + 1;}int countNodes(TreeNode* root) { return depth(root); }
};

总结


补打卡第15天,坚持!!!

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

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

相关文章

面试-java多线程与并发

1.如何实现处理线程的返回值 (1)主线程等待法 主线程等待法&#xff1a;程序执行时&#xff0c;没有等到value值赋予完成&#xff0c;就直接在主函数 中执行打印value的值。 缺点&#xff1a;需要自己去实现循环等待的逻辑。若需要等待的变量变多&#xff0c;需要等待的时间可能…

【信息系统项目管理师知识点速记】变更管理

19.2 变更管理 变更管理是指在信息系统开发与维护过程中,控制所有变更请求,从而确保变更的顺利实施和系统的稳定运行。变更管理的目标是使变更过程透明化,保证每个变更有序可控地进行,减少变更带来的负面影响,提高变更实施的效率和质量。变更管理包括变更申请、评估、批准…

qt.qpa.xcb: could not connect to display问题解决

1、问题描述 以服务器pi5作为远程解释器&#xff0c;本地win11使用vscode远程调试视觉时报错如下&#xff1a; qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "xxxxx" even though it was …

英伟达GB200系列AI芯片供不应求;阿里云通义灵码上线Visual Studio插件市场

&#x1f989; AI新闻 &#x1f680; 英伟达GB200系列AI芯片供不应求 摘要&#xff1a;英伟达GB200系列AI芯片供不应求&#xff0c;台积电和日月光等公司获追加订单。GB200芯片性能提升30倍&#xff0c;成本和能耗降至25分之一。预计2025年出货量突破百万颗&#xff0c;后段封…

ArkUI JS层

JS层代码分析 关键方法&#xff1a; initialRenderobserveComponentCreationViewStackProcessor.StartGetAccessRecordingForViewStackProcessor.StopGetAccessRecording()loadDocument class Index extends ViewPU {constructor(parent, params, __localStorage, elmtId -…

浏览器优化的案例和最佳实践

浏览器优化的案例和最佳实践 减少HTTP请求数量优化资源文件优化DOM结构提升JavaScript性能优化渲染性能移除不必要的插件和扩展监控并分析页面性能持续优化和测试除了上述的优化方式,还有一些其他的浏览器优化技巧,包括: 减少HTTP请求数量 案例:某电商网站首页有大量的图片和C…

探索Java中的多态

多态&#xff08;Polymorphism&#xff09;是面向对象编程&#xff08;OOP&#xff09;中的一个核心概念&#xff0c;它允许同一个接口或方法在不同对象上具有不同的实现方式。Java作为一种面向对象的编程语言&#xff0c;广泛地利用了多态特性来提高代码的灵活性和可扩展性。本…

精准把握时间脉络:Java日期时间处理API深度解析与实战指南

在软件开发领域&#xff0c;准确无误地处理日期和时间信息是构建稳定、可靠应用程序的关键一环。随着技术的演进&#xff0c;Java作为一门广泛应用的编程语言&#xff0c;其处理日期和时间的API也经历了显著的变化和发展&#xff0c;旨在为开发者提供更为强大、灵活且易用的工具…

httpclient并发性能问题解决

故事 前段时间进行招聘笔试&#xff0c;有这么一个问题&#xff0c;请描述实践过程中解决httpclient并发性能问题的案例。然后自己之前是有遇到过&#xff0c;但是一直没有总结&#xff0c;趁此机会总结一波。 问题 请描述实践过程中解决httpclient并发性能问题的案例。并描…

企业级低代码开发效率变革赋能业务增长

企业级低代码开发已经成为当今软件开发领域的一大趋势&#xff0c;它为企业带来了前所未有的效率变革&#xff0c;从而赋能业务增长。本文将围绕这一主题&#xff0c;深入探讨低代码开发的概念、优势以及如何在企业级应用中实现高效的低代码开发&#xff0c;以助力我国企业实现…

Linux网络 - 再谈、详谈UDP和TCP协议

文章目录 前言预备netstatpidofcat /etc/services 一、UDP协议UDP协议端格式UDP的缓冲区基于UDP的应用层协议 二、TCP协议1.TCP协议段格式确认应答(ACK)机制三次握手疑问1 最后一次客户端发给服务端的ACK请求怎么保证服务端能够收到&#xff1f; 四次挥手疑问2 为什么挥手是四次…

51单片机STC89C52RC——4.1 矩阵按键(数码管显示按键值)

目录 目录 目的 一&#xff0c;STC单片机模块 二&#xff0c;矩阵按键模块 2.1 针脚定义 ​编辑 2.2 矩阵按键位置 2.3 如何理解按键按下后针脚的高低电平 2.3.1 错误理解1 2.3.2 错误理解2 2.3.3 正确判定按下的是那个按键的逻辑 2.3.4 判定按键按下的依次扫描程…

2024年618有哪些必囤的好物?2024年618好物排行榜

618年中大促再度来临。对于购物爱好者来说&#xff0c;这无疑是一个不容错过的购物盛宴。那么&#xff0c;在这个618&#xff0c;哪些好物值得你重点关注呢&#xff1f;我特地整理了一份推荐清单&#xff0c;这些产品不仅经过我的亲身体验&#xff0c;更以其出色的实用性和高性…

MySQL中结构化系统变量介绍

结构化变量&#xff08;structured variable&#xff09;与常规系统变量&#xff08;regular system variable&#xff09;之间的两个主要区别。以下是这两个区别的详细解释&#xff1a; 值是一个结构&#xff1a; 常规系统变量通常存储单一的值&#xff0c;比如一个整数、浮…

【XCharts插件】4-2、配置项手册(v3.0)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群:398291828大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 XCharts插件是一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。 【Unity3D…

硬件基础知识——自学习梳理

计算机存储分为闪存和永久性存储。 硬盘&#xff08;永久存储&#xff09;主要分为机械磁盘和固态硬盘。 机械磁盘主要靠磁颗粒的正负极方向来存储0或1&#xff0c;且机械磁盘没有使用寿命。 固态硬盘就有使用寿命了&#xff0c;大概支持30w次的读写操作。 闪存使用的是电容…

使用js实现excel的读取展示以及导出

代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><link rel"st…

liunx打开谷歌报错

liunx打开谷歌报错[48526:48526:0624/173553.311113:ERROR:zygote_host_impl_linux.cc(99)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180. 这个错误信息表明你尝试以root用户身份运行Chrome浏览器&#xff0c;但是没有使用–no-san…

现身说法,AI小白的大模型学习过程

导读 写这篇文章的初衷&#xff1a;作为一个AI小白&#xff0c;把我自己学习大模型的学习路径还原出来&#xff0c;包括理解的逻辑、看到的比较好的学习材料&#xff0c;通过一篇文章给串起来&#xff0c;对大模型建立起一个相对体系化的认知&#xff0c;才能够在扑面而来的大…

idea 突然 Cannot resolve symbol ‘xxx‘

解决一&#xff1a;关闭 idea&#xff0c;在文件夹中找到代码所在位置&#xff0c;删除 .idea 文件夹重新打开项目就可以了 解决二&#xff1a;检查 jdk 版本 解决三&#xff1a;保存重要文件&#xff0c;重新下载项目代码