重生之我在代码随想录刷算法第十三天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

news2024/12/22 20:55:10

参考文献链接:代码随想录

本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。

110.平衡二叉树

力扣题目链接

解题思路

这道题目刚看到以为和二叉树的最大深度差不多,上来写了一堆迭代求深度的代码结果发现不对劲。

看了题解才发现高度和深度是完全不一样的。

知道高度的定义后,如何遍历数呢,那当然是后续遍历,因为后序遍历是左右中,只有知道左和右之后你才能知道中间节点的高度。所以求高度用后续,求深度的话前序即可。

代码示例
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isBalanced(TreeNode root) {
        return getHeight(root) != -1;
    }
    public int getHeight(TreeNode node){
        if(node == null){
            return 0;
        }
        int leftHeight = 0;
        int rightHeight = 0;
        leftHeight = getHeight(node.left);   
        if(leftHeight == -1){
            return -1;
        }
        rightHeight = getHeight(node.right);
        if(rightHeight == -1){
            return -1;
        }
        if(Math.abs(leftHeight - rightHeight) > 1){
            return -1;
        }else{
            return Math.max(leftHeight,rightHeight) + 1;
        }
    }
}

257. 二叉树的所有路径

力扣题目链接

解题思路

首先确定这道题的遍历顺序,因为题目要求是顺序的路径,那我们就得用前序遍历。然后我们还是使用递归法,一层一层去收集路径,当某个节点没有左右子树就说明到头了,收集这个路径即可。递归的时候我们要加入回溯,因为我们要收集所有路径而不是一条,所以递归后要回溯到上层,这样才能收集另一个子树的路径。

更多详细请看代码和注释

代码示例
class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> result = new ArrayList<String>();
        pin(root,new ArrayList<Integer>(),result);
        return result;
    }
	//递归参数解释,paths是每一个节点val的收集,result是每天路径的收集。
    public void pin(TreeNode node,List<Integer> paths,List<String> result){
        //为什么这次终止条件不在最上面,因为终止的时候要把val拼成路径,会漏掉该node的val值,所以要先添加。
        paths.add(node.val);
        if(node.left == null && node.right == null){
            //当没有左右子树就收集路径
            StringBuffer sb = new StringBuffer();
            for(int i = 0;i<paths.size()-1;i++){
                sb.append(paths.get(i)).append("->");
            }
            sb.append(paths.get(paths.size() - 1));
            result.add(sb.toString());
            return;
        }
        //当左子树不为null,就加入递归,递归后记得回溯。
        if(node.left != null){
            pin(node.left,paths,result);
            paths.remove(paths.size() - 1);
        }
        //同理
        if(node.right != null){
            pin(node.right,paths,result);
            paths.remove(paths.size() - 1);
        }
    }
}

404.左叶子之和

力扣题目链接

解题思路

该题目其实跟求最大深度差不多,层序遍历即可,只不过当我们添加左子树进入队列时,判断一下如果该左子树是左叶子,那就加上它的值。

代码示例
class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        int result = 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int len = queue.size();
            while(len-- > 0){
                TreeNode temp = queue.poll();
                if(temp.left != null){
                    //在此处判断加入的左子树是不是左叶子即可。
                    if(temp.left.left == null && temp.left.right == null){
                        result = result + temp.left.val;
                    }
                    queue.offer(temp.left);
                }
                if(temp.right != null){
                    queue.offer(temp.right);
                }
            }
        }
        return result;
    }
}

222.完全二叉树的节点个数

力扣题目链接

解题思路

本题还是跟上述题目一个思路,前序遍历一直记录节点数即可。

递归法
class Solution {
    public int countNodes(TreeNode root) {
        if(root==null){
            return 0;
        }
        //返回左右节点长度+1 1是当前节点
        return countNodes(root.left)+countNodes(root.right)+1;
    }
}
递归法

层序遍历时每次poll的时候result++即可。

class Solution {
    public int countNodes(TreeNode root) {
        if(root==null){
            return 0;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int result = 0;
        while(!queue.isEmpty()){
            int size = queue.size();
            while(size-->0){
                TreeNode now = queue.poll();
                result++;
                if(now.left!=null){
                    queue.offer(now.left);
                }
                if(now.right!=null){
                    queue.offer(now.right);
                }
            }

        }
        return result;
    }
}

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

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

相关文章

非标精密五金加工的技术要求

非标精密五金加工在现代制造业中占据着重要地位&#xff0c;其对于产品的精度、质量和性能有着较高的要求。以下是时利和整理的其具体的技术要求&#xff1a; 一、高精度的加工设备 非标精密五金加工需要先进的加工设备来保证加工精度。例如&#xff0c;高精度的数控机床是必不…

【越学学糊涂的Linux系统】Linux指令篇(2)

一、echo指令&#xff1a; ✔️✔️在终端中显示文本内容或向文件中写入文本 Ⅰ.基本用法&#xff1a; 0x00打印字符串&#xff1a; 打印字符串/显示文本内容&#xff1b;可以用双引号作为文本内容⬇️⬇️更推荐用单引号 这里我将字符串打印出来了。和printf的功能一样&…

【Linux实践】实验五:用户和组群账户管理

【Linux实践】实验五&#xff1a;用户和组群账户管理 实验目的实验内容实验步骤及结果1. 创建用户2. 切换用户3. 修改用户4. 删除用户5. 创建组群6. 修改组群补充&#xff1a;删除组群 实验目的 1、掌握字符界面下用户账户的设置&#xff0c;包括命令useradd、usermod、userde…

深入解析 Apache Kylin

以下是关于 Kylin 概述 部分的内容&#xff0c;你可以在技术博客中使用&#xff1a; 1. Kylin 概述 什么是 Apache Kylin&#xff1f; Apache Kylin 是一个开源的分布式分析引擎&#xff0c;主要为大数据场景下的 OLAP&#xff08;Online Analytical Processing&#xff09;提…

利用echarts 显示图片信息

当前有个需求,需要对其进行相关统计,这里我们采用jquery3.6 与echarts.js 做相关图表,不解释,直接上代码吧 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…

被动元数据的不足和主动元数据的先进性

元数据管理领域&#xff0c;被动元数据管理主要执行的是一种基础且相对直接的任务&#xff0c;即简单地对元数据进行编目或存储。这一过程通常不涉及复杂的逻辑处理或动态分析&#xff0c;而是侧重于数据的静态描述和记录&#xff0c;如数据类型、结构、位置、创建时间等。 这…

【PG备份恢复】基于时间点的恢复(踩坑指南)

1 设置基于时间点恢复所需的配置 要启用WAL归档&#xff0c; 需设置wal_level配置参数为replica或更高&#xff0c;设置archive_mode为on&#xff0c;并且使用archive_command配置参数指定一个shell命令 1.1 修改配置文件 postgresql.conf vim postgresql.conf archive_…

资深老师都在用的成绩发布小程序,月考发成绩就用它!

在教育的长河中&#xff0c;老师们一直扮演着知识传递者的角色。然而&#xff0c;随着时间的流逝&#xff0c;教育的方式也在不断地革新。过去&#xff0c;老师们发布成绩查询的方式既繁琐又耗时。 现在我们有了更高效、更便捷的成绩发布方式。在众多的成绩查询系统中&#xff…

2.数据结构研究

计算机解决问题的步骤 线性表 树 图&#xff08;点线&#xff09;

电脑录屏软件免费版,四款宝藏软件揭秘

在这个数字化时代&#xff0c;无论是教学演示、游戏直播还是软件教程分享&#xff0c;电脑录屏都成为了我们日常生活中不可或缺的一部分。然而&#xff0c;面对市面上琳琅满目的录屏软件&#xff0c;如何选择一款既免费又功能强大的工具&#xff0c;成为了不少小伙伴的难题。今…

桌面专业版【ssh配置】

UOS统信SSH协议的简单使用方法。包含软件安装,服务启动及常见问题等内容。 文章目录 功能概述一、SSH安装二、SSH使用方法三、SSH常见问题1. 无法使用root用户登陆。2. SSH登录提示”connect to hosts xxxx :Connection refused功能概述 SSH 为 Secure Shell 的缩写,由 IET…

手把手搞定VMware 的CentOS硬盘扩容

1.背景 用VMware虚拟机创建Centos系统时&#xff0c;选了40GB硬盘&#xff0c;用着用着发现硬盘不够用了。于是&#xff0c;我为了给硬盘扩容&#xff0c;实操了下centos的硬盘扩容。本文是记录下整个操作过程&#xff0c;方便后面查询和使用。 2.操作 2.1 VMware操作 2.2 Ce…

Goweb---Gorm操作数据库(二)

Gorm允许用户自己自定义钩子操作&#xff0c;使用这些钩子操作&#xff0c;可以在增删改查操作前进行相关的操作和检验&#xff0c;它会在创建、更新、查询、删除时自动被调用。如果任何回调返回错误&#xff0c;GORM 将停止后续的操作并回滚事务。 自定义钩子函数 package ma…

充电宝哪个牌子性价比高?2024年充电宝推荐!7款好用充电宝推荐

近年来&#xff0c;充电宝爆炸、自燃等安全事故屡见不鲜&#xff0c;给人们的生命财产安全带来了严重的威胁。比如 2023 年 1 月&#xff0c;广西桂平的一自建民房凌晨突发大火&#xff0c;经初步调查&#xff0c;起火原因就是充电宝发生短路。2024 年 2 月 19 日晚&#xff0c…

如何在项目申报中实施精细化管理?

项目申报作为企业获取资源、拓展市场、推动创新的关键环节&#xff0c;其成功与否往往直接关系到企业的战略发展。而要在众多申报者中脱颖而出&#xff0c;实现项目申报的成功&#xff0c;精细化管理成为关键因素之一。精细化管理强调的是对项目申报全过程的每一个细节进行精准…

2024 年 8 月公链行业研报:Layer 1、比特币 Layer 2 和以太坊 Layer 2 趋势分析

作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;Footprint Analytics 公链研究页面 8 月&#xff0c;加密货币市场波动剧烈&#xff0c;比特币和以太坊均遭遇了明显下跌。Layer 1 区块链普遍遭受市场颓势&#xff0c;然而&#xff0c;Tron 却逆势…

开源链动 2+1 模式 S2B2C 商城小程序助力品牌实现先营后销与品效合一

摘要&#xff1a;本文探讨了在当今市场环境下&#xff0c;如何做到先营后销、品效合一。通过研究社区用户喜好&#xff0c;打造适合家庭消费的商品&#xff0c;并结合开源链动 21 模式 S2B2C 商城小程序&#xff0c;实现品牌的精准定位、创新包装以及小规格产品供应&#xff0c…

单片机——ADC采样

1、什么是ADC采样&#xff1f; ADC是指将模拟信号转换成数字信号的过程。通俗理解ADC采样就是采集电路中的电压&#xff0c;通过数值的方式表现出来。以STM32F103系列为例&#xff0c;它可以反应0~4095&#xff0c;换句话说&#xff0c;它采集的电压数值上表现为0~4095&#xf…

文心快码获2024北京信息通信行业网络安全产品优秀应用

日前&#xff0c;2024北京互联网大会在京举办。在“网络安全与数据保护”分论坛上&#xff0c;百度智能代码助手文心快码Baidu Comate荣获北京信息通信行业网络安全产品优秀应用案例。 &#xfeff; 本场论坛聚焦“共筑安全底座 服务社会民生”主题&#xff0c;共商北京数字经…

江科大51单片机

文章目录 led灯led点亮led闪烁流水灯 独立按键按键点灯按键消抖按键实现二进制流水灯按键实现流水灯 数码管静态数码管显示动态数码管显示 矩阵键盘定时器/中断串口通信led点阵屏DS1302实时时钟蜂鸣器AT24C02DS18B20LCD1602直流电机驱动AD/DA红外遥控 led灯 创建项目&#xff…