代码随想录算法训练营 DAY 17 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

news2024/11/18 19:35:52

110.平衡二叉树

  • 平衡二叉树的定义:任何节点的左右子树高度差绝对值不超过1 空树也是AVL!

  • 确定遍历顺序:

求高度用后序,求深度用前序。(取决于需不需要从下往上返回结果)

先判断它是不是平衡二叉树 如果是就返回 如果不是就记录一下它的最大高度。

递归函数

  1. 递归函数参数和返回值
int getHeight(TreeNode node)
  1. 确定递归终止条件

如果发现左子树和右子树高度差大于1了,我们直接return -1,告诉上一层已经不是AVL树了

if(node == null) return 0;
  1. 单层递归逻辑

后序遍历:左 右 中

leftHeight = getHeight(node.left); //左
if(leftHeight == -1) return -1;
leftRight = getHeight(node.right); //右
if(rightHeight == -1) return -1;
//能进到这说明属于左右子树AVL的条件,看高度差
if(abs.(leftHeight-rightHeight) > 1)  //中
    result = -1;
else 
    result = 1 + max(leftHeight, rightHeight);
return result;
  • java代码
class Solution {
    public 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;
        
        int result = 0;
        if(Math.abs(leftHeight - rightHeight) > 1) result = -1;
        else result = 1 + Math.max(leftHeight, rightHeight);
        return result;
    }

    public boolean isBalanced(TreeNode root) {
        boolean flag;
        return flag = getHeight(root) >= 0 ? true : false;
    }
}

257.二叉树的所有路径

  • 确定遍历顺序

我们只能用前序遍历。只有前序(中左右)先遍历父节点,才能让根节点一路指下去,让父节点指向孩子节点。
在这里插入图片描述

回溯?

  • 其实就是一个回退的过程,与递归结合在一起的。

这条路走到头了,就回退到原来的位置再重新开始走另一条路。

  1. 确定递归函数
void traversal(TreeNode node, List<Integer> path, List<String> result)

path数组记录其中的一条路径,result数组存放所有的结果。

  1. 确定终止条件
if(node.left == null && node.right == null) {
	result.add(path);  //省略转化逻辑
}

遍历到叶子节点了就停,收获当前结果。

  1. 单层递归逻辑

前序顺序:中左右

我们每遍历到一个节点,就要把这个节点添加进path里。

path.add(node.val);  //中

注意这一句要放在递归函数进来的第一句!不然到叶子节点还没记录就添加结果了

接下来写左 和 右。有没有可能node.left(right)为空也进到下一层递归呢?此时path.add(node.val),结点为空。所以在左右递归之前要先判断是否不为空才遍历。

if(node.left) {
    traversal(node.left,path,result);
    path.remove(); //恢复现场 回溯的过程
}
if(node.right) {
    traversal(node.right,path,result);
    path.remove();  //恢复现场 回溯的过程
}

有递归,就有回溯!退出递归的时候,表示已经收集到了结果或者遍历完了,此时弹出一个元素恢复现场。

这题我们设定是到叶子节点就停下来,不要让空节点进入到递归!所以可以在第一句就add,然后往左右递归之前也要判断是否左右孩子为空

list

  • 完整java代码
class Solution {
    public void traversal(TreeNode node, List<Integer> path, List<String> res) {
        path.add(node.val);  //这一句实际就是处理“中”的逻辑
        if(node.left == null && node.right == null) {  //遇到了叶子节点就收集
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < path.size()-1; i++) {  //在前n-1个数字后面拼上个"->"
                sb.append(path.get(i));
                sb.append("->");
            }
            sb.append(path.get(path.size()-1));  //把最后一个数字拼上去
            res.add(sb.toString());  //收集这一条路径
            return;  //一直收集到叶子节点才会返回!
        }
        
        //递归遍历左和右 记得判断不为空+回溯恢复现场
        if(node.left != null) {
            traversal(node.left, path, res);
            path.remove(path.size()-1);
        }
        if(node.right != null) {
            traversal(node.right, path, res);
            path.remove(path.size()-1);
        }
    }

    public List<String> binaryTreePaths(TreeNode root) {
        List<Integer> path = new ArrayList<>();
        List<String> res = new ArrayList<>();
        traversal(root,path,res);
        return res;
    }
}

404.左叶子之和

左叶子?

首先一定是个叶子节点(左右孩子都为空),其次一定是它父节点的左孩子!(根节点一定不是)

之前的题目,我们都是遍历到一个元素,才判断这个元素是不是符合的 我们要进行收集,但是这题不一样!

判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。

遍历顺序

用后序比较简洁,因为要一层一层向上返回。父节点只要把左子树的左叶子和 与 右子树的左叶子和相加就行。

递归函数

  1. 递归函数
int traversal(TreeNode node)
  1. 终止条件
if(node == null) return 0;
if(node.left == null && node.right == null) {  //只是遇到叶子节点
	return 0;
}

遇到叶子节点也要return 0(因为它的左子树和右子树都没有左叶子之和)

  1. 单层逻辑
int leftSum = traversal(node.left);  //收集左子树里的左叶子和
if(node.left != null && node.left.left == null && node.left.right == null)  //如果左孩子不为空 且左孩子是叶子节点
    leftSum = node.left.val;  //收集
int rightSum = traversal(node.right);  //收集右子树里的左叶子和
return leftSum + rightSum;  //中
  • 完整代码
class Solution {
    public int traversal(TreeNode node) {
        if(node == null) return 0;
        if(node.left == null && node.right == null) return 0; //叶子节点的左右子树 左叶子和为0

        int leftSum = traversal(node.left);  //收集左子树里的左叶子和
        if(node.left != null && node.left.left == null && node.left.right == null)  //如果左孩子不为空 且左孩子是叶子节点
            leftSum = node.left.val;  //收集
        int rightSum = traversal(node.right);  //收集右子树里的左叶子和
        return leftSum + rightSum;  //中
    }

    public int sumOfLeftLeaves(TreeNode root) {
        return traversal(root);
    }
}

理解这两个递归终止条件!不是为了收集值服务的,是为了终止递归。

day17总结

  1. List可以用list.get(i)获取第i个元素

    List用list.remove(i)删除第i个元素

    List长度是list.size()

  2. StringBuilder转换为String用sb.toString()

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

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

相关文章

图论07-被包围的区域(Java)

7.被包围的区域 题目描述 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 示例 1&#xff1a; 输入&#xff1a;board [["X","X","X",&qu…

【进程概念】进程状态以及僵尸进程(结合代码)

文章目录 进程状态实验观察进程的各个状态动态监视进程的脚本代码样本1&#xff1a;观察S&#xff08;浅度睡眠&#xff09;状态代码样本2&#xff1a;观察R(运行)状态发送kill -19 信号 观察T&#xff08;暂停&#xff09;状态&#xff1a;调试代码&#xff0c;观察t&#xff…

原型、原型链

如图&#xff1a; 判断对错&#xff1a; Q1:在JS 中 proto 和 constructor 属性是对象和函数都有的属性 prototype属性仅是函数对象所独有的。 由于JavaScript中一切皆对象,即函数对象也是一种对象,所以函数也拥有__proto__和constructor属性。 Q2:通过 proto 属性来连接对象…

MOSDANET

# in the figure refers to the first term of Equation 1 辅助信息 作者未提供代码

2024年【山东省安全员C证】免费试题及山东省安全员C证作业考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证免费试题根据新山东省安全员C证考试大纲要求&#xff0c;安全生产模拟考试一点通将山东省安全员C证模拟考试试题进行汇编&#xff0c;组成一套山东省安全员C证全真模拟考试试题&#xff0c;学员可通过…

Python中的环境管理与虚拟环境的使用【第148篇—虚拟环境】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的环境管理与虚拟环境的使用 在Python开发中&#xff0c;环境管理是至关重要的一环…

【CKA模拟题】学会JSONPath,精准定位Pod信息!

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesyou have a script named pod-filter.sh . Update this script to include a command that filters and displays the label with the…

轻松去除视频号水印:高效下载无痕视频教程

短视频已经成为了我们获取知识、娱乐消遣的主要途径之一。而视频号作为一个新兴的短视频平台&#xff0c;凭借其丰富的内容和便捷的操作界面&#xff0c;吸引了大量用户的关注。然而&#xff0c;有时候我们想要保存自己喜欢的视频&#xff0c;却发现视频上带有水印&#xff0c;…

蓝桥杯2023省赛:蜗牛|DFS暴力、DP动态规划

题目链接&#xff1a; 1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路说明&#xff1a; 首先&#xff0c;考虑DFS暴力解&#xff1a;对于蜗牛来说&#xff0c;它出发的起点可能是&#xff1a; 1、Xi竹竿底部2、从上一根杆Xi-1传送门传送到的bi&#xff0c; 那么他有三种方式走&…

vue2源码学习01配置rollup打包环境

1.下载rollup相关依赖 npm i rollup rollup-plugin-babel babel/core babel/preset-env --save-dev 2.新建rollup.config.js配置打包选项 //rollup可以导出一个对象&#xff0c;作为打包的配置文件 import babel from rollup-plugin-babel export default {input: ./src/ind…

【Linux】/proc文件系统

&#x1f525;博客主页&#xff1a;PannLZ &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 文章目录 /proc文件系统1.获取与进程相关的信息:/proc/ID2./proc 目录下的系统信息3. 访问/proc 文件4.动态创建/proc文件系统4.1创建目录4.2创建proc…

程序设计语言与C语言发展

我们今天开始 来讲 C语言 程序设计 首先 我们来看一下 它的课程地位 对于 计算机科学等相关专业 我们这样安排 第一学期 学习 C语言基础 第二学期 学习 C语言程序进阶 第三学期 学习 一门面向对象语言 例如 java c python等 第四学期 学习 数据结果 第五学期 操作系统 最后 学…

【教程】PLSQL查看表属性乱码解决方法

一、前言 PL/SQL是Oracle数据库的编程语言&#xff0c;用于编写存储过程、触发器、函数等。 今天用plsql想查看表的属性&#xff0c;看看各个字段的注释&#xff0c;可是打开一看&#xff0c;居然是乱码的&#xff0c;如下面这样 如果在使用PL/SQL查看表属性时出现乱码&…

(一)基于IDEA的JAVA基础5

Scanner的使用 使用scanner可以接收键盘上输入的数据&#xff0c; Scanner inputnew Scanner(System.in)&#xff1b; 导包的方式: 什么是导包&#xff0c;导入的是jdk提供的java开发工具包&#xff0c;我们建一个java文件&#xff0c;psvm快捷输入后&#xff0c;打上new S…

预约陪诊APP定制开发方案以及流程详解

随着医疗行业的快速发展&#xff0c;越来越多的人开始关注自己的健康问题。然而&#xff0c;在看病的过程中&#xff0c;很多人都会感到孤独和无助。为了解决这个问题&#xff0c;许多医疗机构和企业推出了预约陪诊APP,旨在为用户提供一个安全、便捷的陪伴服务。本文将详细介绍…

基于Java的厦门旅游电子商务预订系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

【漏洞复现】金和OA IncentivePlanFulfill.aspx SQL注入漏洞

0x01 产品简介 金和OA协同办公管理系统C6软件&#xff08;简称金和OA&#xff09;&#xff0c;本着简单、适用、高效的原则&#xff0c;贴合企事业单位的实际需求&#xff0c;实行通用化、标准化、智能化、人性化的产品设计&#xff0c;充分体现企事业单位规范管理、提高办公效…

基于Springboot的农产品销售管理系统+数据库+免费远程调试

项目介绍: 基于Springboot的农产品销售管理系统。Javaee项目&#xff0c;springboot项目。采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过SpringMvc SpringBootMybatisVuemaven来实现。MyS…

大数据--hdfs--java编程

环境&#xff1a; virtualbox ubantu1604 Linux idea社区版2023 jdk1.8 hadoop相关依赖 使用java操作 1. 判断/user/stu/input/test.txt文件是否存在&#xff0c;存在则读出文件内容&#xff0c;打印在控制台上。反之&#xff0c;输出“文件不存在”。 package abc;impo…

5 线程网格、线程块以及线程(2)

5.3 线程块 即使有512个线程&#xff0c;也不能让你在GPU上斩获颇丰。对很多在CPU上编程的编程人员来说&#xff0c;这似乎是一个很大的数量&#xff0c;但其实在GPU上编程的时候&#xff0c;512个线程并不一定会让你获得很高的效益&#xff0c;对于GPU而言&#xff0c;通常我…