110.平衡二叉树 , 257. 二叉树的所有路径 ,404.左叶子之和

简介: 以下是针对这三道二叉树相关问题的简介:本内容涵盖了三道经典的二叉树算法题及其解决方案。第一题“平衡二叉树”通过递归计算左右子树高度差,判断是否为高度平衡二叉树;第二题“二叉树的所有路径”利用深度优先搜索(DFS)遍历树,记录从根节点到叶子节点的所有路径;第三题“左叶子之和”通过递归遍历二叉树,累加所有左叶子节点的值。这些题目帮助理解二叉树的递归与遍历逻辑,适用于算法学习与实践。

题目: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] 内

-104 <= Node.val <= 104

题解:

class Solution {
public:
    // 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1
    int getHeight(TreeNode* node) {
        if (node == NULL) {
            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 : 1 + max(leftHeight, rightHeight);
    }
    bool isBalanced(TreeNode* root) {
        return getHeight(root) == -1 ? false : true;
    }
};

题目:257. 二叉树的所有路径

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

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

示例 1:

输入:root = [1,2,3,null,5]

输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]

输出:["1"]

提示:

树中节点的数目在范围 [1, 100] 内

-100 <= Node.val <= 100

题解:

class Solution {
private:
 
    void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
        path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中  
        // 这才到了叶子节点
        if (cur->left == NULL && cur->right == NULL) {
            string sPath;
            for (int i = 0; i < path.size() - 1; i++) {
                sPath += to_string(path[i]);
                sPath += "->";
            }
            sPath += to_string(path[path.size() - 1]);
            result.push_back(sPath);
            return;
        }
        if (cur->left) { // 左  
            traversal(cur->left, path, result);
            path.pop_back(); // 回溯
        }
        if (cur->right) { // 右
            traversal(cur->right, path, result);
            path.pop_back(); // 回溯
        }
    }
 
public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        vector<int> path;
        if (root == NULL) return result;
        traversal(root, path, result);
        return result;
    }
};

题目: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

题解:

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if (root == NULL) return 0;
        if (root->left == NULL && root->right== NULL) 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);  // 右
 
        int sum = leftValue + rightValue;               // 中
        return sum;
    }
};
相关文章
|
6月前
|
机器学习/深度学习
977.有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵II
1. **997. 有序数组的平方**:给定非递减顺序的整数数组,返回每个数字平方后的新数组,要求结果仍为非递减顺序。提供了两种解法——使用`sort()`函数和双指针法,后者利用原数组有序特性优化时间复杂度。 2. **209. 长度最小的子数组**:寻找和大于等于目标值的最短连续子数组长度。采用滑动窗口(毛毛虫比喻)方法,在O(n)时间内完成任务,通过动态调整窗口大小实现高效求解。 3. **59. 螺旋矩阵 II**:生成一个按顺时针螺旋排列的n×n矩阵。通过模拟填充过程,依次向右、下、左、上四个方向扩展边界,直至填满整个矩阵。
|
6月前
|
算法
​860. 柠檬水找零​,406.根据身高重建队列
**简介:** 本文介绍了两道经典算法题的解法与思路。第一题“柠檬水找零”通过贪心算法解决找零问题,核心在于优先使用大面额钞票找零以保留更灵活的小面额;第二题“根据身高重建队列”利用排序与插入操作,通过先按身高降序排列再按k值插入位置的方式实现队列重建。两题均体现了贪心算法在局部最优推导全局最优中的应用,同时展示了如何通过合理排序和模拟操作高效解决问题。
|
6月前
|
算法
93.复原IP地址 ,78.子集 , 90.子集II
. **有效IP地址恢复**:给定一个数字字符串,目标是通过插入三个`.`将其划分为四个合法的部分,每部分为0到255之间的整数且无前导零。解决方案使用回溯法枚举所有可能的分割方式,并通过合法性检查筛选出有效的IP地址。 2. **子集生成(78. 子集)**:给定一个无重复元素的整数数组,任务是生成其所有可能的子集(幂集)。通过回溯法遍历树形结构,每次递归将当前路径加入结果集,确保收集所有节点而非仅叶子节点。 3. **子集生成II(90. 子集 II)**:与上题类似,但输入数组可能包含重复元素。为避免重复子集,先对数组排序,再利用布尔数组标记元素使用状态,在同一树层跳过重复元素。
|
人工智能 Java API
教你自创工作流,赋予AI助理个性化推荐超能力
本文详细介绍了使用Spring AI Alibaba构建AI助理的全过程,涵盖从基本流程设计到实际操作实现的各个方面。文章首先回顾了前期工作,包括旅游攻略、天气查询和个人待办事项等功能模块的设计与实现。接着,深入探讨了工作流的实现细节,如事件封装优化、工作流节点创建及复杂工作流的高效管理。最后,通过实际项目启动与运行测试,展示了AI助理的实际效果,验证了系统的稳定性和可扩展性。本文不仅适合Java开发者学习AI技术,也为后续的优化和功能拓展提供了宝贵的经验。
1545 8
教你自创工作流,赋予AI助理个性化推荐超能力
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
1116 59
|
6月前
|
数据采集 自然语言处理 搜索推荐
Python内置函数ord()详解
`ord()` 是 Python 中用于将单个字符转换为对应 Unicode 码点的核心函数,支持 ASCII、多语言字符及特殊符号。其返回值为整数(范围 0-1114111),适用于字符编码验证、数据清洗、自定义排序、基础加解密等场景。使用时需注意参数长度必须为 1,否则会触发 `TypeError`。结合 `chr()` 函数可实现双向转换,进阶技巧包括多字节字符处理、编码范围检测及字符分类验证等。
|
6月前
|
Linux
linux文件重命名命令
本指南介绍Linux文件重命名方法,包括单文件操作的`mv`命令和批量处理的`rename`命令。`mv`可简单更改文件名并保留扩展名,如`mv old_file.txt new_name.txt`;`rename`支持正则表达式,适用于复杂批量操作,如`rename &#39;s/2023/2024/&#39; *.log`。提供实用技巧如大小写转换、数字序列处理等,并提醒覆盖风险与版本差异,建议使用`-n`参数预览效果。
|
6月前
|
关系型数据库 MySQL
MySQL字符串拼接方法全解析
本文介绍了四种常用的字符串处理函数及其用法。方法一:CONCAT,用于基础拼接,参数含NULL时返回NULL;方法二:CONCAT_WS,带分隔符拼接,自动忽略NULL值;方法三:GROUP_CONCAT,适用于分组拼接,支持去重、排序和自定义分隔符;方法四:算术运算符拼接,仅适用于数值类型,字符串会尝试转为数值处理。通过示例展示了各函数的特点与应用场景。
|
存储 测试技术 计算机视觉
开源视频版GPT-4o?快速记忆,实时问答,拿下CVPR'24长视频问答竞赛冠军
【7月更文挑战第24天】Flash-VStream, 一款模拟人脑记忆的视频语言模型,实现实时长视频流理解和问答,夺得CVPR&#39;24竞赛桂冠。它采用动态记忆技术,高效存储检索信息,大幅降低推理延迟与显存消耗,超越现有模型。虽有资源限制及复杂查询处理难题,仍展现卓越通用性及先进性能。[详细论文](https://arxiv.org/abs/2406.08085)。
341 17