算法训练营第二十天 | LeetCode 110平衡二叉树、LeetCode 257 二叉树的所有路径、LeetCode 404 左叶子之和

server/2024/12/23 4:18:08/

LeetCode 110 平衡二叉树

递归写法很简单,直接自底向上每个节点判断是否为空,为空说明该层高度为0。不为空用一个int型变量l记录左子树高度(递归调用该函数自身),一个int型变量r记录右子树高度(同样递归调用该函数自身),将l和r相减取绝对值,大于1说明不平衡直接返回-1,此外还需要判断l和r是否已经是-1,这种情况下也直接返回-1。这样判断的底层原理是计算每个节点返回值是高度还是-1,取-1也是因为不会影响到正常高度的计算。最后来到递归遍历阶段,返回1+max(l,r)即可。

这个过程中,最上层是确认返回条件,中间是确认参数和返回值,最下层是递归逻辑。

代码如下:

class Solution {
public:int height(TreeNode* root) {if (!root) return 0; int l = height(root->left), r = height(root->right);if (abs(l - r) > 1) return -1;else if (l == -1) return -1;else if (r == -1) return -1;return 1 + max(l, r); }bool isBalanced(TreeNode* root) {if (height(root) != -1) return true;else return false;}
};

LeetCode 257 二叉树的所有路径

这题对于学过回溯法的人来说,很明显是回溯了。新手可能会有点头痛。

回溯法本质上也是一种递归,是一种暴力枚举。在递归过程中,如果没有后续状态就会把当前这一条路径放进存储结果的集合中,返回当前函数到上一层。而如果有后续状态,就先记录当前路径,将当前路径加上其中一个下一状态,用这一路径继续递归,直到返回,在其语句后面还要将路径还原至递归前。相当于先给你一个苹果,让你吃完之后看苹果是啥样子,记录下来,再一路回到你吃苹果之前,把苹果给别人吃,看又是啥样子。这样的递归过程就能实现一种暴力枚举。

代码如下:

class Solution {
private:vector<string> res;string path = "";
public:void backtracking(TreeNode* cur) {if (!cur->left && !cur->right) {res.push_back(path);}else {if (cur) {string temp = path;if (cur->left) {string s = to_string(cur->left->val);path += "->";path += s;backtracking(cur->left);path = temp;}if (cur->right) {string s = to_string(cur->right->val);path += "->";path += s;backtracking(cur->right);path = temp;}}}}vector<string> binaryTreePaths(TreeNode* root) {if (!root) return res;string s = to_string(root->val);path += s;backtracking(root);return res;}};

还需要注意的有递归起始状态,返回条件和每次递归逻辑的确定。

本题还可以尝试迭代法来写。暂时先放这,等会来写。

LeetCode 404 左叶子之和

其实前序遍历等遍历方式中选一种就行了,需要注意的是左叶子首先要是某个叶子的左节点,然后还要是叶子节点。可以顺便满足这个遍历情况的,前序遍历是肯定可以的。中序遍历也可以,层序遍历和后续遍历会比较麻烦一点。这里给出前序遍历实现的代码如下:

class Solution {
public:int sumOfLeftLeaves(TreeNode* root) {int sum = 0;TreeNode* cur = root;queue<TreeNode*> myque;while (cur || !myque.empty()) {while (cur) {myque.push(cur);if (cur->left) {if (!cur->left->left && !cur->left->right)sum += cur->left->val;}cur = cur->left;}cur = myque.front();myque.pop();cur = cur->right;}return sum;}
};


http://www.ppmy.cn/server/35632.html

相关文章

unittest_parameterized批量测试测试用例

import unittest from parameterized import parameterizeddef add(x, y):return xy"""问题&#xff1a;如果有三组数据需要测试&#xff1f;[(1,1,2), (1,2,3), (0,3,3)] """def get_data():return [(1, 2, 3), (3, 0, 3), (2, 1, 3)]# 定义测试…

【高校科研前沿】中国科学院地理资源所钟帅副研究员研究组博士生朱屹东为一作在Top期刊发文:从潜力到利用:探索西藏风能资源开发的技术路径优化布局

01 文章简介 论文名称&#xff1a;From potential to utilization: Exploring the optimal layout with the technical path of wind resource development in Tibet&#xff08;从潜力到利用:探索西藏风能资源开发的技术路径优化布局&#xff09; 文章发表期刊&#xff1a;《…

美国防部发布《DevSecOps持续授权实施指南》(上)

文章目录 前言一、介绍(一)什么是持续授权?二、cATO能力(一)评价标准三、方法(一)基本概念(二)软件工厂应包括以下内容:(三)评估方式前言 美国防部首席信息官4月11日发布《DevSecOps 持续授权实施指南》,旨在指导美国国防机构实现持续授权操作(cATO),以操作由…

优化百度SEO:蜘蛛池自动收录的秘诀(蜘蛛池秒收录)

蜘蛛池自动收录技术解析 百度作为国内最大的搜索引擎之一&#xff0c;在网络搜索领域拥有巨大的影响力。对于网站主来说&#xff0c;如何让自己的网站在百度搜索结果中排名靠前&#xff0c;成为关注的焦点。其中&#xff0c;SEO&#xff08;SearchEngineOptimization&#xff…

Python发送邮件

这里使用 的是Python 中的 smtplib 模块来实现发送电子邮件。以下是一个简单的示例代码&#xff0c;演示如何使用给定的信息发送电子邮件&#xff1a; import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart# 你的邮箱信息 se…

【一步一步了解Java系列】:探索Java基本类型转换的秘密

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹。 如果喜欢能否点个赞支持一下&#…

六淳科技IPO终止背后:十分着急上市,大额分红,实控人买豪宅

华西证券被暂停保荐业务资格6个月的影响力逐渐显现。 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;东莞六淳智能科技股份有限公司&#xff08;下称“六淳科技”&#xff09;及其保荐人撤回上市申请材料。因此&#xff0c;深圳证券交易所决定终止对其首次公开发行…

JavaScript中Math函数与舍入

立方根 console.log(Math.sqrt(25)); //数学方式25平方根 console.log(25 ** (1 / 2)); //25的0.5次方 console.log(8 ** (1 / 3)); //8的1/3次方计算最大最小值 console.log(Math.max(1, 5, 88, 22, 132)); //返回最大值 console.log(Math.max(1, 5, 88, 22, 132)); //…