【代码随想录算法训练营Day17】● 110.平衡二叉树;● 257. 二叉树的所有路径;● 404.左叶子之和

文章目录

  • Day 17 第六章 二叉树part04
    • 110.平衡二叉树 (优先掌握递归)
      • 基础
      • 递归思路
      • 递归代码
    • 257. 二叉树的所有路径 (优先掌握递归)
      • 递归思路
      • 递归代码
    • 404.左叶子之和 (优先掌握递归)
      • 思路
      • 自己的思路(✅通过)
      • 随想录代码

Day 17 第六章 二叉树part04

  • 今日内容:
    • ● 110.平衡二叉树;● 257. 二叉树的所有路径;● 404.左叶子之和
    • 迭代法,大家可以直接过,二刷有精力的时候 再去掌握迭代法。

110.平衡二叉树 (优先掌握递归)

  • 再一次涉及到,什么是高度,什么是深度,可以巩固一下。
  • 题目链接:https://leetcode.cn/problems/balanced-binary-tree
  • 视频讲解:https://www.bilibili.com/video/BV1Ug411S7my
  • 文章讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html

基础

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
    • 求深度:从上到下,前序遍历(中左右)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。
    • 求高度:从下到上,后序遍历(左右中)

递归思路

因为平衡二叉树的概念是每个节点的左右子树高度差的绝对值不大于1,所以就可以比较每个节点左右子树的高度,所以使用后序遍历

  1. 确定递归函数的参数和返回值
    • 参数:节点
    • 返回值:返回当前节点的高度,但当从该节点就能看出不是平衡二叉树则返回-1
  2. 确定终止条件
    • 终止条件:传入节点为空,返回0
  3. 确定单层递归的逻辑
    • 获取左子树高度,获取右子树高度,差大于一返回-1,小于一返回最大高度+1

递归代码

public static boolean isBalanced(TreeNode root) {return getHeight(root) != -1;
}
public static int getHeight(TreeNode root){//当节点为空返回0,高度为0if(root == null) return 0;//先得到左子树的高度int left = getHeight(root.left);//如果是-1直接不是平衡二叉树了if(left == -1) return -1;//再得到右子树的高度int right = getHeight(root.right);if(right == -1) return -1;if(Math.abs(left - right) > 1) return -1;else return Math.max(left, right) + 1;
}

257. 二叉树的所有路径 (优先掌握递归)

  • 这是大家第一次接触到回溯的过程, 我在视频里重点讲解了 本题为什么要有回溯,已经回溯的过程。
  • 如果对回溯 似懂非懂,没关系, 可以先有个印象。
  • 题目链接:https://leetcode.cn/problems/binary-tree-paths/
  • 视频讲解:https://www.bilibili.com/video/BV1ZG411G7Dh
  • 文章讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html

递归思路

从上到下找路径。所以使用前序遍历

  1. 确定递归函数的参数和返回值
    • 参数:节点,path,res
      • path:存储单条路径
      • res:存储结果,放path的集合
    • 返回值:不用返回void
  2. 确定终止条件
    • 终止条件:传入节点为空,返回
  3. 确定单层递归的逻辑

递归代码

public static List<String> binaryTreePaths(TreeNode root) {LinkedList<String> res = new LinkedList<>();getPath(root, "", res);return res;
}
public static void getPath(TreeNode root,  String path, LinkedList<String> res){//如果节点为空返回if(root == null) return;//如果是叶子结点就把当前的path和val加入resif(root.left == null && root.right == null){res.add(path + root.val);return;}//当该节点不是叶子节点,把"val->"加入path递归getPath(root.left, path + root.val + "->", res);getPath(root.right, path + root.val + "->", res);
}

404.左叶子之和 (优先掌握递归)

  • 其实本题有点文字游戏,搞清楚什么是左叶子,剩下的就是二叉树的基本操作。
  • 题目链接:https://leetcode.cn/problems/sum-of-left-leaves/
  • 视频讲解:https://www.bilibili.com/video/BV1GY4y1K7z8
  • 文章讲解:https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html

思路

精准踩雷,没看清是左叶子,以为是所有左节点
另一个疑问,为啥不能用int类型直接加,哦应该用返回,不能作为参数

自己的思路(✅通过)

public static int sumOfLeftLeaves(TreeNode root) {int sum = 0;ArrayList<Integer> res = new ArrayList<>();dfs(root, res);for(int i : res){sum += i;}return sum;
}
public static void dfs(TreeNode root, ArrayList<Integer> res){if(root == null) return;if(root.left != null && root.left.right == null && root.left.left == null) res.add(root.left.val);dfs(root.left, res);dfs(root.right, res);System.out.println(res);
}

随想录代码

public int sumOfLeftLeaves(TreeNode root) {if (root == null) return 0;int leftValue = sumOfLeftLeaves(root.left);    // 左int rightValue = sumOfLeftLeaves(root.right);  // 右int midValue = 0;if (root.left != null && root.left.left == null && root.left.right == null) { midValue = root.left.val;}int sum = midValue + leftValue + rightValue;  // 中return sum;
}

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

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

相关文章

在spring中操作Redis

目录 创建项目 ​编辑 配置Redis 创建类 StringRedisTemplate set / get list set Hash zset 新年快乐&#xff01;&#xff01;&#xff01;&#xff01; 创建项目 选中maven项目&#xff0c;然后选择java8&#xff0c;输入名称之后&#xff0c;点击next。 随后选择…

C++多重继承

C多重继承 C中的多重继承是指一个类可以从多于一个的基类派生出来&#xff0c;这允许在一个派生类中继承多个基类的特性和行为。多重继承增加了C的灵活性和表达能力&#xff0c;但同时也带来了一些复杂性&#xff0c;如菱形继承问题和潜在的命名冲突。 基本用法 定义一个多重…

C++中类的6个默认成员函数 【拷贝构造函数】

文章目录 拷贝构造函数的使用拷贝构造对于自定义类型【浅拷贝】深拷贝拷贝构造函数典型调用场景 拷贝构造函数的使用 在前几章学习对象的时候&#xff0c;我们有的时候需要一个与已存在对象一某一样的新对象 那在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对…

(02)Hive SQL编译成MapReduce任务的过程

目录 一、架构及组件介绍 1.1 Hive底层架构 1.2 Hive组件 1.3 Hive与Hadoop交互过程 二、Hive SQL 编译成MR任务的流程 2.1 HQL转换为MR源码整体流程介绍 2.2 程序入口—CliDriver 2.3 HQL编译成MR任务的详细过程—Driver 2.3.1 将HQL语句转换成AST抽象语法树 词法、语…

C# CAD SelectionFilter下TypedValue数组

SelectionFilter是用于过滤AutoCAD实体的类&#xff0c;在AutoCAD中&#xff0c;可以使用它来选择具有特定属性的实体。构造SelectionFilter对象时&#xff0c;需要传入一个TypedValue数组&#xff0c;它用于定义选择规则。 在TypedValue数组中&#xff0c;每个元素表示一个选…

VScode中配置 C/C++ 环境 | IT拯救者

文章目录 0 引言1. 下载编辑器VScode2. 下载编译器MinGW并解压3. 将MinGW添加至环境变量4. 配置VScode插件5. 运行代码6. 调整和优化7. 提示8. 例行格式条款9. 例行格式条款 0 引言 由于VScode毛毛张使用不习惯&#xff0c;因此配置教程记不住&#xff0c;不过毛毛张看到一篇不…

「递归算法」:两两交换链表中的节点

一、题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xf…

计算机二级数据库之数据模型(三层相关的结构)

数据模型 模型的概念 模型的介绍模型是对现实世界特征的模拟和抽象&#xff0c; 数据模型的概念&#xff1a; 数据模型是对现实世界中数据特征的抽象&#xff0c;描述的是数据的共性。 数据模型是用来在数据库中抽象、表示和处理现实世界中的数据和信凹。 其相关的共同特…

论文阅读:《Deep Learning-Based Human Pose Estimation: A Survey》——Part 1:2D HPE

目录 人体姿态识别概述 论文框架 HPE分类 人体建模模型 二维单人姿态估计 回归方法 目前发展 优化 基于热图的方法 基于CNN的几个网络 利用身体结构信息提供构建HPE网络 视频序列中的人体姿态估计 2D多人姿态识别 方法 自上而下 自下而上 2D HPE 总结 数据集…

Python二级考试笔记

Python二级考试笔记【源源老师】 01. 字符串 1. 常规功能合集 字符串本身有一些功能&#xff0c;有些之前运用过&#xff0c;这里总结如下&#xff1a; # 功能一&#xff1a;判断字符串类型 print(type("Hello")) print(str(123)) # 转换# 功能二&#xff1a;连…

vs win cmake生成的.sln文件INSTALL右键生成的文件为什么在C:\Program Files (x86) 路径下,指定安装目录

1 cmakelists.txt没有设置变量 CMAKE_INSTALL_PREFIX 2 cmake源码默认生成的文件放置路径 #if defined(_WIN32) && !defined(__CYGWIN__)std::string prgfiles;std::string sysDrive;if (cmsys::SystemTools::GetEnv("ProgramFiles", prgfiles)) {this->…

Java解决查找包含给定字符的单词

Java解决查找包含给定字符的单词 01 题目 给你一个下标从 0 开始的字符串数组 words 和一个字符 x 。 请你返回一个 下标数组 &#xff0c;表示下标在数组中对应的单词包含字符 x 。 注意 &#xff0c;返回的数组可以是 任意 顺序。 示例 1&#xff1a; 输入&#xff1a;…

相机图像质量研究(27)常见问题总结:补光灯以及遮光罩对成像的影响--遮光罩

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

【leetcode题解C++】46.全排列 and 47.全排列II

46. 全排列 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输入&…

[AIGC] 消息积压了,该如何处理?

在构建分布式系统时&#xff0c;开发人员经常会遇到消息积压的问题。当系统的处理能力不足时&#xff0c;消息会在队列中积压&#xff0c;导致系统 slowed down 或 even crashed。为了解决这个问题&#xff0c;我们需要采取一些措施来缓解消息积压。 文章目录 什么是消息积压&…

MyBatis篇----第七篇

系列文章目录 文章目录 系列文章目录前言一、简述 Mybatis 的插件运行原理,以及如何编写一个插件。二、MyBatis实现一对一有几种方式?具体怎么操作的 ?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

GoJS可视化JavaScript库讲解

1.简介 GoJS是一个可视化JavaScript库&#xff0c;用于浏览器中创建交互图形&#xff0c;&#xff08;比如流程图&#xff0c;树图&#xff0c;关系图&#xff0c;力导图等等&#xff09;。允许您为用户构建各种图表&#xff0c;从简单的流程图、组织图到图表、SCADA和BPMN图表…

windows 下跑起大模型(llama)操作笔记

原贴地址&#xff1a;https://testerhome.com/topics/39091 前言 国内访问 chatgpt 太麻烦了&#xff0c;还是本地自己搭一个比较快&#xff0c;也方便后续修改微调啥的。 之前 llama 刚出来的时候在 mac 上试了下&#xff0c;也在 windows 上用 conda 折腾过&#xff0c;环…

Docker 镜像是什么?常用的镜像命令有哪些?

docker 镜像仓库相关的命令&#xff1a;Docker 镜像仓库是什么&#xff1f;有哪些镜像仓库命令&#xff1f;-CSDN博客 1. Docker 镜像 Docker 镜像是一个轻量级、独立、可执行的软件包&#xff0c;它包含了运行特定应用程序所需的所有内容&#xff1a;代码、运行时环境、系统工…

OpenAI宣布ChatGPT新增记忆功能;谷歌AI助理Gemini应用登陆多地区

&#x1f989; AI新闻 &#x1f680; OpenAI宣布ChatGPT新增记忆功能&#xff0c;可以自由控制内存&#xff0c;提供个性化聊天和长期追踪服务 摘要&#xff1a;ChatGPT新增的记忆功能可以帮助AI模型记住用户的提问内容&#xff0c;并且可以自由控制其内存。这意味着用户不必…