「代码随想录算法训练营」第十三天 | 二叉树 part3

news/2024/11/15 6:39:46/文章来源:https://www.cnblogs.com/frontpen/p/18307783

110. 平衡二叉树

题目链接:https://leetcode.cn/problems/balanced-binary-tree/
题目难度:简单
文章讲解:https://programmercarl.com/0110.平衡二叉树.html
视频讲解:https://www.bilibili.com/video/BV1Ug411S7my
题目状态:通过

思路:

采用递归的方式,遍历每个节点的左右孩子的深度以及其之间的深度差是否超过 1,如果超过 1 的话,就直接返回false,直到遍历结束。

代码实现:

/*** 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 isBalancedUtil(TreeNode *root, int &balanced) {if(root == nullptr) return 0;int leftHeight = isBalancedUtil(root->left, balanced);if(balanced == 0) return 0;int rightHeight = isBalancedUtil(root->right, balanced);if(balanced == 0) return 0;if(abs(leftHeight - rightHeight) > 1) balanced = 0;return max(leftHeight, rightHeight) + 1;}bool isBalanced(TreeNode* root) {int balanced = 1;isBalancedUtil(root, balanced);return balanced;}
};

代码随想录提供了一种更好的代码:

class Solution {
public:int getHeight(TreeNode *node) {if(node == nullptr) return 0;int leftHeight = getHeight(node->left);if(leftHeight == -1) return -1;int rightHeight = getHeight(node->right);if(rightHeight == -1) return -1;return abs(leftHeight - rightHeight) > 1 ? -1 : (max(leftHeight, rightHeight) + 1);}bool isBalanced(TreeNode *root) {return getHeight(root) == -1 ? false : true;}
};

257. 二叉树的所有路径

题目链接:https://leetcode.cn/problems/binary-tree-paths/
题目难度:简单
文章讲解:https://programmercarl.com/0257.二叉树的所有路径.html
视频讲解:https://www.bilibili.com/video/BV1ZG411G7Dh
题目状态:一点思路也没有

学习思路:

学习回溯,看下图

回溯和递归是不分开的,当每次进行递归的时候将之前保存的路径中的节点pop出去,这就是回溯。

定义递归函数:

  1. 传入参数:
    a. TreeNode *node:传入一个节点。
    b. vector<int> path:通过一个path来记录沿途的路径,便于之后的回溯。
    c. vector<string> res:用来记录最终结果。
  2. 返回值:没有返回值,递归的结果在res中存放。
  3. 终止条件:当该节点的左孩子和右孩子都为nullptr时,递归终止。
  4. 递归思路:采用前序遍历,先将节点压入path中,再判断其左右孩子是否都为nullptr(此时为递归结束,即该节点为叶子节点),若不为nullptr,分别将其左右孩子(不为空的那个)进入递归,此时将path中该节点pop出来(这个就是回溯)。

代码实现:

/*** 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 backtracking(TreeNode *node, vector<int> &path, vector<string> &res) {// 中path.push_back(node->val);// 终止条件if(node->left == nullptr && node->right == nullptr) {string sPath;for(int i = 0; i < path.size() - 1; ++i) {sPath += to_string(path[i]);sPath += "->";}sPath += to_string(path[path.size() - 1]);res.push_back(sPath);return;}// 左if(node->left) {backtracking(node->left, path, res);path.pop_back();}// 右if(node->right) {backtracking(node->right, path, res);path.pop_back();}}vector<string> binaryTreePaths(TreeNode* root) {vector<string> res;vector<int> path;if(root == nullptr) return res;backtracking(root, path, res);return res;}
};

404. 左叶子之和

题目链接:https://leetcode.cn/problems/sum-of-left-leaves/
题目难度:简单
文章讲解:https://programmercarl.com/0404.左叶子之和.html
视频讲解:https://www.bilibili.com/video/BV1GY4y1K7z8
题目状态:通过

个人思路:

定义一个int类型变量leftSum,用来存储结果使用层序遍历,当遍历到该节点的左孩子时,若其左孩子没有左孩子和右孩子(即该节点的左孩子为叶子节点),将其值加入leftSum中。

代码实现:

/*** 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 sumOfLeftLeaves(TreeNode* root) {queue<TreeNode *> que;if(root == nullptr) return 0;int leftSum = 0;que.push(root);while(!que.empty()) {TreeNode *node = que.front();que.pop();if(node->left) {que.push(node->left);if(node->left->left == nullptr && node->left->right == nullptr) leftSum += node->left->val;}if(node->right) que.push(node->right);}return leftSum;}
};

递归思想的代码:

/*** 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 sumOfLeftLeaves(TreeNode* root) {if(root == nullptr) return 0;if(root->left == nullptr && root->right == nullptr) return 0;int leftValue = sumOfLeftLeaves(root->left);if(root->left && !root->left->left && !root->left->right) leftValue += root->left->val;int rightValue = sumOfLeftLeaves(root->right);// 这里面leftValue代表左孩子的左叶子节点值之和,rightValue代表右孩子的左叶子节点值之和int sum = leftValue + rightValue;return sum;}
};

222. 完全二叉树的节点个数

题目链接:https://leetcode.cn/problems/count-complete-tree-nodes/
题目难度:简单
文章讲解:https://programmercarl.com/0222.完全二叉树的节点个数.html
视频讲解:https://www.bilibili.com/video/BV1eW4y1B7pD
题目状态:通过

思路:

层序遍历,加个计数sum

代码实现:

/*** 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 countNodes(TreeNode* root) {queue<TreeNode *> que;if(root == nullptr) return 0;que.push(root);int sum = 1;while(!que.empty()) {TreeNode *node = que.front();que.pop();if(node->left) {que.push(node->left);sum++;}if(node->right) {que.push(node->right);sum++;}}return sum;}
};

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

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

相关文章

京东云智能编程助手与安全大模型双双获奖!

人工智能大模型浪潮迭起,为更好地推广人工智能应用案例,中国通信工业协会及中国通信工业协会人工智能专委会近日发布《CCIA2023年度人工智能优秀案例》,京东云申报的Joycoder智能编程助手入选“AI技术创新应用”,京东云与深圳市信息安全管理中心联合申报的“安全大模型保障…

京东上万程序员都AI用它!

7月3日,中国信息通信研究院在全球数字经济大会上发布“2024安全守卫者计划优秀案例”,基于京东云智能编码工具JoyCoder研发的“京东微调大模型驱动漏洞修复”入选优秀案例。 该漏洞修复助手,能够对大模型生成代码进行智能修复,为程序员开启代码漏洞修复的“自动驾驶”模式,…

【YashanDB知识库】oracle dblink varchar类型查询报错记录

问题单:Oracle DBLINK查询崖山DB报错 oracle服务器上ODBC安装 unixodbc安装:yum -y install unixODBC mysql 配置安装对应版本的odbc: myodbc-installer -d -a -n "MySQL8.0" -t "DRIVER=/home/oracle/tools/mysql-connector-odbc-8.0.20/lib/libmyodbc8w.so…

以电商、消费行业为例,详解火山引擎数智平台如何应用湖仓一体架构

湖仓一体架构是一种将数据湖和数据仓库的优势结合起来的新型数据架构。作为新一代企业级数据产品,火山引擎数智平台在旗下产品中对湖仓一体架构进行深入探索和应用,本篇将从数据湖内核、服务设计及应用场景等方面进行详细拆解。更多技术交流、求职机会,欢迎关注字节跳动数据…

负载均衡-Ribbon-微服务核心组件【分布式微服务笔记03】

负载均衡-Ribbon-微服务核心组件【分布式微服务笔记03】 负载均衡-Ribbon 基本介绍Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。 Ribbon 主要功能是提供客户端负载均衡算法和服务调用 Ribbon 客户端组件提供一系列完善的配置项如连接超时,重试…

创建第一个flask程序,读取本地static静态文件

需要安装flask :  pip install flask 项目目录结构: 代码: from flask import Flaskapp = Flask(__name__,static_url_path=/static,static_folder=static)@app.route(/)def hello_world(): return Hello World!if __name__ == __main__: app.run(host="0.0.0.…

ComfyUI进阶:Comfyroll插件 (二)

ComfyUI进阶:Comfyroll插件 (二)前言:学习ComfyUI是一场持久战,而Comfyroll Studio 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业的图像生成与编辑工具。借助这些节点,用户可以在静态图像的精细调整和动态动画的复杂构建方面进行深入探…

zr 摆烂记

你说得对,我也不知道怎么整合到数数论论里。 \((a,b)=1\) 是 \(ax\equiv 1(\bmod b)\) 有解的充要条件。 首先,对于 \(x=0\rightarrow b-1\),\(ax\equiv y(\bmod b)\),\(y\) 互不相同。 证明考虑加加减减。 考虑求出这个解,得到 \(ax=by+1\)。 不难有推论:若 \((a,b)=1\)…

WKCTF RE

WKCTF so_easy 安卓逆向,关键的check逻辑都在native层里面主要是很多层的异或操作除了Z3和爆破想不到其他方法了 from z3 import *src = [ 0xAE, 0x81, 0xBA, 0xC1, 0xF0, 0x95, 0x0A, 0x54, 0x14, 0x03, 0x4A, 0xE2, 0x52, 0x4E, 0x84, 0xF8, 0xC9, 0x3E, 0x14, 0x98, 0x8F,…

Java - 多线程

ThreadLocalhttps://www.cnblogs.com/fsmly/p/11020641.html 为了线程安全,每个线程改的都是自己本地的副本,从而不会影响其它线程。多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的…

OpenAI 创始成员创办「AI+教育」公司;谷歌发布 Magic Insert:让人物完美融入新背景丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点…

云屏设备整机软件升级方案

最近时间稍微空闲,整理下云屏整机设备的OTA流程及方案。之前开发时有过定义/设计,这里稍微整理总结下 整机软件有很多模块,系统及外设固件、Windows服务、Windows应用,比如系统点屏9969、摄像头固件、触摸框固件、显卡驱动、Windows一些自研服务(用于通信以及系统修复等)…