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

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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MT2191 整数大小比较(高精度)

给出两个正整数&#xff0c;判断他们的大小。 输入格式&#xff1a; 两个正整数。 输出格式&#xff1a; 若前者大&#xff0c;输出>&#xff1b; 若后者大&#xff0c;输出<&#xff1b; 若一样大&#xff0c;输出。 输入&#xff1a; 1412894619244619891 23762842…

G1垃圾回收器深入探索——卡表、记忆集和SATB算法

G1垃圾回收器&#xff0c;我们常常会提到里面的分区和垃圾回收算法&#xff0c;这次我们撇开表层&#xff0c;仔细看看里面的三个核心组成部分及其原理。 Card Table&#xff08;卡表&#xff09; 在进行YoungGC时&#xff0c;我们会判断一个对象是否被引用&#xff0c;但这个过…

软考复习笔记day3(计算机体系结构和指令系统基础)(精简版)

计算机体系结构分类 处理机数量分类&#xff1a; 单处理&#xff08;一个处理单元&#xff09;并行处理系统&#xff08;两个以上处理机互联&#xff09;.分布式处理系统 Flynn分类&#xff1a;&#xff08;常考&#xff09; 以指令流和数据流进行区别 指令流由控制部分进…

Keepalive与idle监测及性能优化

Keepalive 与 idle监测 Keepalive&#xff08;保活&#xff09;: Keepalive 是一种机制&#xff0c;通常用于TCP/IP网络。它的目的是确保连接双方都知道对方仍然存在并且连接是活动的。这是通过定期发送控制消息&#xff08;称为keepalive消息&#xff09;实现的。如果在预定时…

使用aop做权限控制

1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:/…

甘当“银行引流中介”?飞猪旅行的“猪小金”产品暗藏玄机

在今年“315”晚会上&#xff0c;央视曝光了同程金融以赊销礼包、回购礼品卡的套路变相开展高息“现金贷”等业务乱象。目前&#xff0c;同程金融已对相关产品进行下线&#xff0c;同时对该公司所有产品进行合规性检查。 而这种在监管灰色地带试探的戏码&#xff0c;也出现阿里…

离散数学之范式方法

引子&#xff1a; 对于一个命题&#xff0c;如何判定命题公式为永真式、永假式和可满足的呢或二个命题公式等价。我们学过二种方法&#xff1a; 1&#xff0c;真值表法&#xff1a;对于变元的所有真值指 派&#xff0c;看对应命题公式的真值。2&#xff0c;命题演算方法&#…

YOLO算法改进Backbone系列之:CAT

Transformer广泛应用于NLP后&#xff0c;在CV领域也引起了广泛关注&#xff0c;但是将单词token替换为图像的patch使得Transformer计算量大幅增加。本文提出一种新的注意力机制Cross Attention&#xff0c;不再计算全局注意力而是将注意力的计算局限在patch内部来捕获局部信息&…

美区id怎么充值,可以使用虚拟信用卡吗?

美区apple id可以绑使用虚拟卡绑定&#xff0c;并且可以使用 今天早上刚刚尝试的&#xff0c;我用的卡头556167&#xff0c;点击获取卡

抖音平台热销的本腾和新讯随身WiFi,哪个更靠谱,更值得购买?

经常有粉丝朋友摆脱小编测评一下在某短视频平台上面非常火爆的两款随身WiFi&#xff0c;本腾随身WiFi和新讯随身WiFi到底哪个更好。今天&#xff0c;小编就为大家带来最真实的体验测评。 一、外观和产品 这方面新讯要比本腾做的更好&#xff0c;本腾的设备相对单一一些。新讯则…

电脑安装双系统windows和ubuntu server

1.创建Ubuntu-server的启动盘 首先要从官网下载Ubuntu-server18.04的ISO文件&#xff0c;用rufs烧录到U盘。如下所示 2. 磁盘分区 在windows创建两个盘&#xff08;linuxboot 和linuxroot&#xff09;&#xff0c;后面一个一个用于boot&#xff0c;一个用于root. 3.开机U盘启…

Vmware虚拟机强制退出Ubuntu后无法开启,报错【开机时出错: VMware Player 无法连接到虚拟机。】

1. 现象 虚拟机强制退出Ubuntu后无法开机&#xff0c;报错如下&#xff1a; 2. 解决方法 任务管理器结束VMware相关的任务

CBAM解析及代码(Pytorch)

CBAM&#xff0c;全称Convolutional Block Attention Module&#xff0c;是一种注意力机制模块&#xff0c;用于增强卷积神经网络&#xff08;CNN&#xff09;的特征表达能力。该模块由通道注意力模块和空间注意力模块两部分组成&#xff0c;能够分别关注输入特征图的通道信息和…

算法思想总结:模拟算法

一、模拟算法的总结 1、本质&#xff1a;比葫芦画瓢 2、特点&#xff1a;思路较简单&#xff0c;根据题目要求即可&#xff0c;代码量和细节较多 3、解决方法&#xff1a; &#xff08;1&#xff09; 模拟算法流程&#xff0c;在草稿纸上进行演算 &#xff08;2&#xff09;…

GAMMA数据处理问题(七)

phase_sim_orb报这个错是什么原因呢&#xff0c;说是我的hgt文件和模拟的干涉图行数不匹配&#xff0c;之前geocode生成hgt的参数不是在mli.par文件中看吗&#xff0c;为什么会出现行数不匹配的情况啊&#xff0c;难道不是par文件中里面看&#xff1f;&#xff1f;&#xff1f;…

【C++庖丁解牛】二叉搜索树(Binary Search Tree,BST)

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 二叉搜索树概念2. 二叉…

结构体内存对齐 offsetof 枚举 联合体

文章目录 结构体结构体内存对齐结构体嵌套结构体内存对齐的原因修改默认对齐数设置默认对齐数 #pragma pack() offsetof() 是宏 offset偏移量 of是谁的偏移量。计算结构体成员相对于结构体的起始位置偏移量是几。 结构体传参值传递地址传递 位段枚举联合 联合体 共用体联合体大…

【JS】深度学习JavaScript

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【JS】深度学习JavaScript &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一:JavaScript1.1 JavaScript是什么1.2 JS的引入方式1.3 JS变量1.4 数据类型1.5 …

LeetCode 热题 100 | 堆(二)

目录 1 什么是优先队列 1.1 优先队列与堆的关系 1.2 如何定义优先队列 1.3 如何使用优先队列 1.4 如何设置排序规则 2 347. 前 K 个高频元素 2.1 第 2 步的具体实现 2.2 举例说明 2.3 完整代码 3 215. 数组中的第 K 个最大元素 - v2 菜鸟做题&#xff0c;语…

【漏洞复现】科立讯通信指挥调度平台editemedia.php sql注入漏洞

漏洞描述 在20240318之前的福建科立讯通信指挥调度平台中发现了一个漏洞。该漏洞被归类为关键级别,影响文件/api/client/editemedia.php的未知部分。通过操纵参数number/enterprise_uuid可导致SQL注入。攻击可能会远程发起。 免责声明 技术文章仅供参考,任何个人和组织使…