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

110. 平衡二叉树

给定一个二叉树,判断它是否是 平衡二叉树

平衡二叉树:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

思路:

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。

思路:利用递归求树的高度,并在求树的高度的同时判断左右子树高度是否相差大于1

递归三部曲

函数传递参数与返回值:参数:当前传入节点。 返回值:以当前传入节点为根节点的树的高度。

返回-1表示当前结点的树不是平衡二叉树

明确终止条件

递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0

单层递归逻辑:判断左右子树是否为平衡二叉树,判断当前子树是否为平衡二叉树

 代码参考:

class Solution {
    public boolean isBalanced(TreeNode root) {
       return getHeight(root)==-1?false:true;
    }
     int getHeight(TreeNode root){
        if(root==null)return 0;
        int leftHeight=getHeight(root.left);
        if(leftHeight==-1)return -1;
        int rightHeight=getHeight(root.right);
        if(rightHeight==-1)return -1;
        int deff=Math.abs(leftHeight-rightHeight);
        if(deff>1){
        return -1;
        }
        return 1+Math.max( getHeight(root.left),getHeight(root.right));
    }
    
}

 


257. 二叉树的所有路径

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

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

示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

思路:本题用回溯法遍历所有到叶节点的路径

递归三要素: 

1确定返回值和参数类型:

要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值

2确认递归条件:

遇见叶子结点时,是当 root不为空,其左右孩子都为空的时候,就找到叶子节点。

 if (root->left == NULL && root->right == NULL) {
    终止处理逻辑
}

为什么没有判断root是否为空呢?

我们的代码在递归过程中root不会为空

遇到叶子结点时我们要把该结点添加到路径中,并将该路径加入res

3确认单层递归逻辑:

回溯代码:

 if(root.left!=null){
        traversal(root.left,paths,res);
        paths.remove(paths.size()-1);
    }
 if(root.right!=null){
        traversal(root.right,paths,res);
        paths.remove(paths.size()-1);
    }

整体代码:

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
       List<String> res= new LinkedList();
       if(root==null)
       return res;
       List<Integer> paths= new LinkedList();
       traversal(root,paths,res);
       return res;
    }
    private void traversal(TreeNode root,  List<Integer> paths, List<String> res){
    paths.add(root.val);
    if(root.left==null&&root.right==null){
        //遇到叶子结点,将路径加入res
      StringBuilder sb=new StringBuilder();
      for(int i=0;i<paths.size()-1;i++){
        sb.append(paths.get(i)+"->");
      }
      sb.append(paths.get(paths.size()-1));
      res.add(sb.toString());
      return;
    }
    //递归和回溯
    if(root.left!=null){
        traversal(root.left,paths,res);
        paths.remove(paths.size()-1);
    }
    if(root.right!=null){
        traversal(root.right,paths,res);
        paths.remove(paths.size()-1);
    }
    }
}

404. 左叶子之和

给定二叉树的根节点 root ,返回所有左叶子之和。

示例 1:

输入: root = [3,9,20,null,null,15,7] 
输出: 24 
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24

 左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点

递归三部曲:

1.确定返回值和参数类型:

判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以返回int

使用题目中给出的函数就可以了。

2.确定终止条件:

如果遍历到空节点,那么左叶子值一定是0

if (root == NULL) return 0;

3.单层递归逻辑:

该子树的的左叶子结点之和=左子树的左叶子结点之和+右子树的左叶子结点之和+midValue(左子树可能为左叶子)

整体代码:

class Solution {
    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;
    }
}

另一种代码肯能更好理解:

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) return 0;
        int leftValue=0;
//左节点为左叶子,leftValue= root.left.val;
        if (root.left != null && root.left.left == null && root.left.right == null) { 
            leftValue= root.left.val;
        }else{ 
//左结点不为左叶子,左节点为Null,leftValue ,左节点不为null,leftValue =下一结点的leftValue + rightValue
       leftValue = sumOfLeftLeaves(root.left); 
        }   // 左
        int rightValue = sumOfLeftLeaves(root.right);  // 右
     int sum =  leftValue + rightValue;  // 中
        return sum;
    }
}

 

 

 

 

 

 

  

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

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

相关文章

深度探索:在 Postman 中实现自动化测试的全面指南!

在当今的软件开发过程中&#xff0c;API&#xff08;应用程序编程接口&#xff09;的使用变得越来越普遍&#xff0c;API 允许不同系统之间进行通信和数据交换&#xff0c;从而实现复杂的功能和服务集成&#xff0c;为了确保 API 的可靠性和稳定性&#xff0c;自动化测试至关重…

如何利用RunnerGo简化性能测试流程

在软件开发过程中&#xff0c;测试是一个重要的环节&#xff0c;需要投入大量时间和精力来确保应用程序或网站的质量和稳定性。但是&#xff0c;随着应用程序变得更加复杂和庞大&#xff0c;传统的测试工具在面对比较繁琐的项目时非常费时费力。这时&#xff0c;一些自动化测试…

量子计算+运营优化!IonQ 和 德国DESY 合作提升机场登机口调度效率

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨 沛贤 深度好文&#xff1a;1200字丨8分钟阅读 3月14日&#xff0c;量子计算公司IonQ宣布了与德国电子同步加速器&#xff08;DESY&#xff0c;德国的大型粒子物理学研…

出现nginx error 问题

报错&#xff1a; Something has triggered an error on your website. This is the default error page for nginx that is distributed with Fedora. It is located /usr/share/nginx/html/50x.html You should customize this error page for your own site or edit the er…

PLC网关在工业自动化领域的作用及如何选择-天拓四方

一、PLC网关在工业自动化领域的重要性和作用 PLC网关在工业自动化领域的重要性和作用不言而喻。作为工业自动化系统的重要组成部分&#xff0c;PLC网关起到了关键的桥梁作用&#xff0c;实现了PLC与其他设备、系统之间的数据传输和通信。 首先&#xff0c;PLC网关的重要性体现…

nodeJs 学习

常用快捷键 二、fs模块 回调函数为空&#xff0c;则表示写入成功&#xff01; 练习 const fs require(fs); fs.readFile(../files/成绩.txt, utf-8, (err, dataStr) > {if (err) {console.log(读取失败);return err;}console.log(读取成功);const arr dataStr.split( )co…

SpringBoot整合WebService

WebService是一个SOA&#xff08;面向服务的编程&#xff09;的架构&#xff0c;它是不依赖于语言&#xff0c;不依赖于平台&#xff0c;可以实现不同的语言间的相互调用&#xff0c;通过Internet进行基于Http协议的网络应用间的交互。 其实WebService并不是什么神秘的东西&…

MISC:常见编码

一、字符编码 1.ASCII码 使用指定7位或8位二进制数组合表示128-256种可能。 常⻅考点&#xff1a;解题过程中给出十进制或十六进制的连续数值。 进制转换工具&#xff1a; ASCII text,Hex,Binary,Decimal,Base64 converter (rapidtables.com) 2.Base64编码 ASCII编码以8个比特…

鸿蒙Harmony应用开发—ArkTS(@Prop装饰器:父子单向同步)

Prop装饰的变量可以和父组件建立单向的同步关系。Prop装饰的变量是可变的&#xff0c;但是变化不会同步回其父组件。 说明&#xff1a; 从API version 9开始&#xff0c;该装饰器支持在ArkTS卡片中使用。 概述 Prop装饰的变量和父组件建立单向的同步关系&#xff1a; Prop变量…

马斯克的 Grok-1 开源,3140亿参数目前最大开源模型,最佳实践教程来啦

近几天开源社区最大的热点&#xff0c;莫过于埃隆马斯克信守承诺的最大开源模型Grok-1。 Grok-1 是一款 314B 大型专家混合 (Mixture of Expert&#xff0c;MoE) Transformer&#xff0c;作为基础模型&#xff0c;基于大量文本数据进行训练&#xff0c;没有针对任何具体任务进…

计算机二级Python题目3

题目来源&#xff1a;计算机二级Python半个月抱佛脚大法&#xff08;内呈上真题版&#xff09; - 知乎 目录 1. 基础题 1.1 基础题1 1.2 基础题2 1.3 基础题3 2. turtle绘图题 3. 大题 3.1 大题1 3.2 大题2 1. 基础题 1.1 基础题1 a,b,ceval(input()) ls[] for i in …

Base系列

1.计数系统 base,这个词在数学中表示基数&#xff0c;即计数系统中用于表示数字的不同符号的数量。 例&#xff1a; 二进制计数系统中只有两个符号表示数字&#xff0c;即0和1&#xff0c;故二进制系统可以用Base2表示。 十进制计数系统中仅使用十个符号表示数字&#xff0c;即…

二、阅读器的开发(初始)-- 2、阅读器开发

1、epubjs核心工作原理 1.1 epubjs的核心工作原理解析 epub电子书&#xff0c;会通过epubjs去实例化一个Book对象&#xff0c;Book对象会对电子书进行解析。Book对象可以通过renderTo方法去生成一个Rendition对象&#xff0c;Rendition主要负责电子书的渲染&#xff0c;通过R…

QT gridlayout 循环设置组件,表格也通用 已解决

在需求中。经常遇到&#xff0c;表格 展示需求。 几乎都是json格式的。 // 列表配置文件QJsonArray listJsonArray getCfgJsonData("details_tab_table_config.json");if (listJsonArray.isEmpty()){return;}ui->gridWidget->setMaximumSize(QSize(310, 180)…

Matlab在高光谱遥感中的作用:从数据处理到决策支持

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

【机器学习300问】44、P-R曲线是如何权衡精确率和召回率的?

关于精确率和召回率的基础概念我已经写了两篇文章&#xff0c;如果友友还不知道这两个评估指标是什么&#xff0c;可以先移步去看看这两篇文章&#xff1a; 【机器学习300问】25、常见的模型评估指标有哪些&#xff1f;http://t.csdnimg.cn/JtuUO 总结一下这两个概念&a…

进度图画法

exce表格进度图画法&#xff0c;体现在条形图以及“格子”的空间的填充两种办法。 1.excel表格画进度图 备注&#xff1a;表格照着就是可以了&#xff0c;主要是画直线的办法 在形状的下拉菜单中选择直线&#xff0c;按住shift&#xff08;可以画直线&#xff09; 画直线后&a…

一站式App流量统计,Xinstall助您洞悉用户行为

在如今的移动互联网时代&#xff0c;App的推广和运营对于开发者来说至关重要。然而&#xff0c;想要精准掌握App的流量情况&#xff0c;却并不是一件容易的事情。这时&#xff0c;一款强大的App流量统计工具就显得尤为重要。而Xinstall&#xff0c;正是这样一款能够帮助开发者轻…

收集数据的二维码怎么做?创建表单活码的制作方法

通过二维码来收集用户信息是现在经常被使用的一种方式&#xff0c;通过扫码二维码展现表单&#xff0c;用户根据问题填写自己的想法或者信息&#xff0c;有效的简化用户操作的流程&#xff0c;也能够提升管理者获取信息的速度&#xff0c;能够快速针对用户数据做分析。 那么表…

PLC常用通信协议应用

PLC通信协议 ModbusModbus协议介绍Modbus协议的应用Modbus通信模式 Modbus RTU通讯Modbus RTU报文映射寄存器常见功能码数据类型Modbus CRC校验计算Modbus RTU举例&#xff08;读位&#xff09;Modbus RTU举例&#xff08;读字&#xff09; Modbus TCP协议应用TCP数据帧Modbus …