代码随想录刷题day15丨110.平衡二叉树,257. 二叉树的所有路径, 404.左叶子之和 ,222.完全二叉树的节点个数

news2024/11/13 10:09:09

代码随想录刷题day15丨110.平衡二叉树,257. 二叉树的所有路径, 404.左叶子之和 ,222.完全二叉树的节点个数

1.题目

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

  • 题目链接:110. 平衡二叉树 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html

  • 解题思路:递归(后序遍历)

  • 代码:

    /**
     * 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) {
            int res = getHeight(root);
            return res == -1 ? false:true;
    
        }
        // 返回以该节点为根节点的二叉树的高度,如果不是平衡二叉树了则返回-1
        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;
            }
    
            if(Math.abs(leftHeight - rightHeight) > 1){
                return -1;
            }else{
                int result = 1 + Math.max(leftHeight,rightHeight);
                return result;
            }
        }
    }
    
  • 总结:

    • 求高度用后序遍历,求深度用前序遍历

      在这里插入图片描述

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

  • 题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径_哔哩哔哩_bilibili

  • 文档讲解: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

  • 解题思路:递归(前序遍历)

    • 这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。
    • 这道题目涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。
  • 代码:

    /**
     * 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 List<String> binaryTreePaths(TreeNode root) {
            List<String> res = new ArrayList<>();// 存最终的结果
            if(root == null){
                return res;
            }
            List<Integer> paths = new ArrayList<>();// 作为结果中的路径
            traversal(root,paths,res);
            return res;
        }
    
        public void traversal(TreeNode node, List<Integer> paths, List<String> res){
            paths.add(node.val);
            //遇到叶子结点
            if(node.left == null && node.right == null){
                // StringBuilder用来拼接字符串,速度更快
                StringBuilder s = new StringBuilder();
                for(int i = 0;i < paths.size() - 1;i++){
                    s.append(paths.get(i)).append("->");
                }
                s.append(paths.get(paths.size() -1));//记录最后一个节点
                String s1 = s.toString();
                res.add(s1);// 收集一个路径
                return;
            }
            if(node.left != null){
                traversal(node.left,paths,res);
                paths.remove(paths.size() -1);// 回溯
            }
            if(node.right != null){
                traversal(node.right,paths,res);
                paths.remove(paths.size() -1);// 回溯
            }
        }
    }
    
  • 总结:

    • 回溯和递归是一一对应的,有一个递归,就要有一个回溯

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

  • 题目链接:404. 左叶子之和 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html

  • 解题思路:递归(后序遍历)

    • 要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。

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

在这里插入图片描述

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

  • 如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子

  • 代码:

    /**
     * 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 int sumOfLeftLeaves(TreeNode root) {
            return traversal(root);
        }
    
        public int traversal(TreeNode node){
            if(node == null){
                return 0;
            }
            if(node.left == null && node.right == null){
                return 0;
            }
            int leftNum = traversal(node.left);//左
            if(node.left != null && node.left.left == null && node.left.right == null){
                leftNum = node.left.val;
            }
            int rightNum = traversal(node.right);//右
            int sum = leftNum + rightNum;//中
            return sum;
        }
    }
    
  • 总结:

    • 递归的遍历顺序为后序遍历(左右中),是因为要通过递归函数的返回值来累加求取左叶子数值之和。

1.4完全二叉树的节点个数(优先掌握递归)

  • 题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0222.%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%8A%82%E7%82%B9%E4%B8%AA%E6%95%B0.html

  • 解题思路:递归(后序遍历)

    • 完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

      • 对于情况一,可以直接用 2^树深度 - 1 来计算,注意这里根节点深度为1。

      • 对于情况二,分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

        在这里插入图片描述

      • 可以看出如果整个树不是满二叉树,就递归其左右孩子,直到遇到满二叉树为止,用公式计算这个子树(满二叉树)的节点数量。

    • 这里关键在于如何去判断一个左子树或者右子树是不是满二叉树呢?

      • 在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。
  • 代码:

    /**
     * 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 {
        /**
         * 针对完全二叉树的解法
         *
         * 满二叉树的结点数为:2^depth - 1
         */
        public int countNodes(TreeNode root) {
            return getNum(root);
        }
    
        public int getNum(TreeNode node){
            if(node == null){
                return 0;
            }
            TreeNode leftNode = node.left;
            TreeNode rightNode = node.right;
            int leftLength = 0;// 这里初始为0是有目的的,为了下面求指数方便
            int rightLength = 0;
            while(leftNode != null){
                leftNode = leftNode.left;
                leftLength++;
            }
            while(rightNode != null){
                rightNode = rightNode.right;
                rightLength++;
            }
            if(leftLength == rightLength){
                return (2 << leftLength) - 1;// 注意(2<<1) 相当于2^2,所以leftDepth初始为0
            }
            int leftNum = getNum(node.left);//左
            int rightNum = getNum(node.right);//右
            int res = leftNum + rightNum + 1;//中
            return res;
        }
    }
    
    class Solution {
        // 通用递归解法
        public int countNodes(TreeNode root) {
            if(root == null) {
                return 0;
            }
            return countNodes(root.left) + countNodes(root.right) + 1;
        }
    }
    
  • 总结:

    • 注意针对完全二叉树的解法得前提是完全二叉树

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

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

相关文章

探索数字沙龙——文本描述生成数字人3D发型的专业工具

一、引言 随着数字媒体创作领域不断发展,创作者们对于细节和真实感的要求越来越高。特别是在头发造型这一方面,如何准确地捕捉到人物的个性和情感,成为了3D建模和动画制作中的重要环节。为此,我们介绍了一款名为“数字沙龙”的3D头发造型工具,它旨在为数字媒体创作者提供…

分类预测|基于灰狼GWO优化BP神经网络的数据分类预测Matlab程序GWO-BP|基于鲸鱼WOA优化BP神经网络的数据分类预测Matlab程序WOA-BP

分类预测|基于灰狼GWO优化BP神经网络的数据分类预测Matlab程序GWO-BP|基于鲸鱼WOA优化BP神经网络的数据分类预测Matlab程序WOA-BP 文章目录 前言分类预测|基于灰狼GWO优化BP神经网络的数据分类预测Matlab程序GWO-BP|基于鲸鱼WOA优化BP神经网络的数据分类预测Matlab程序WOA-BP 一…

系统编程-多线程1

多线程1 目录 多线程1 引入 认识线程 1、线程的概念 2、线程的优缺点 3、进程和线程的区别和联系 4、什么时候选进程&#xff0c;什么时候选线程&#xff1f; 线程相关函数 1、创建线程 2、线程的退出函数 3、阻塞等待线程退出 并回收资源 4、获取自身线程号的函数…

算法设计:实验一分治与递归

【实验目的】 深入理解分治法的算法思想&#xff0c;应用分治法解决实际的算法问题。 【实验内容与要求】 设有n2k个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表&#xff1a; 1.每个选手必须与其他n-1个选手各赛一次&#xff1b;2.每个选手一天只能赛一…

[Algorithm][综合训练][消减整数][最长上升子序列(二)][春游]详细讲解

目录 1.消减整数1.题目链接2.算法原理详解 && 代码实现 2.最长上升子序列(二)1.题目链接2.算法原理详解 && 代码实现 3.春游1.题目链接2.算法原理详解 && 代码实现 1.消减整数 1.题目链接 消减整数 2.算法原理详解 && 代码实现 解法&#x…

【Linux】POSIX版本 信号量

目录 信号量的基本操作 基于信号量和环形队列的生产消费模型 之前我们在System V版本的进程间通信说过信号量&#xff0c;这里我们说的是POSIX&#xff08;Portable Operating System Interface for uniX 可移植操作系统接口&#xff09;版本的并且会说的更加详细 我们之前对…

论文3解析(复现):六自由度机械臂轨迹规划研究-部分2

论文&#xff1a;六自由度机械臂轨迹规划研究&#xff0c;马强 上一篇&#xff0c;介绍了一些基础知识&#xff0c;那么接下来是这篇论文的核心部分&#xff0c;轨迹规划的事。 一般来说&#xff0c;轨迹规划有2种&#xff0c;一种是对于笛卡尔坐标系&#xff0c;一种是对于关…

nginx反向代理,负载均衡,动静分离

反向代理&#xff0c;负载均衡 nginx通常被用作后端服务器的反向代理&#xff0c;这样就可以很方便的实现动静分离以及负载均衡&#xff0c;从而大大提高服务器的处理能力。 nginx实现动静分离&#xff0c;其实就是在反向代理的时候&#xff0c;如果是静态资源&#xff0c;就…

Open3D mesh 去除噪点

目录 一、概述 1.1去除噪点的方法 1.2应用 二、代码实现 三、实现效果 3.1原始点云 3.2添加噪声的mesh Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 在三维网格…

在 H100 GPU 上使用 Hugging Face Quanto 优化 AI 模型

基于 Transformer 的扩散模型日益完善&#xff0c;已被证明能够彻底改变文本到图像的生成方式。Transformer 的功能不仅能增强模型的可扩展性和性能&#xff0c;还会增加模型的复杂性。 在这种情况下&#xff0c;模型的复杂性越高&#xff0c;功耗和内存消耗也就越大。 例如&am…

《JavaEE进阶》----3.<SpringBoot项目创建细节大全+打jar包运行>

本篇博客讲解了 创建Spring Boot项目的各种方法及创建细节、还有项目中目录和代码的简单介绍、启动项目、换端口号、Web服务器简介、HTTP状态码、以及用Maven打jar包运行。 什么是Spring Spring让开发Java工程项目变得更快、更简单、更安全。 它专注于开发工程时的速度、简化…

Python在神经网络中优化激活函数选择使用详解

概要 在神经网络中,激活函数扮演着至关重要的角色。它的主要作用是引入非线性因素,使得神经网络能够处理复杂的非线性问题。如果没有激活函数,神经网络仅仅是线性模型的堆叠,无法胜任深度学习中的各种任务。本文将深入探讨几种常用的激活函数,包括Sigmoid、Tanh、ReLU及其…

【JVM】垃圾收集器与GC日志(二)

垃圾收集器与GC日志 ZGC收集器(Z Garbage Collector,全并发、超低延迟 10ms) ZGC是一款JDK11中新加入的具有实验性质的低延迟垃圾收集器&#xff0c;ZGC可以说源自于Azul System公司开发的C4(Concurrent Continuously Compacting Collector)收集器 参考文章&#xff1a;http…

5G 4G 空口信令APN携带差异

4G 终端在PDN connectivity request中access_pt_name中携带。 msg_type 208 (0xd0) (PDN connectivity request) lte_esm_msgpdn_connectivity_reqpdn_type 3 (0x3) (Ipv4v6)req_type 1 (0x1) (initial request)info_trans_flag_incl 0 (0x0)access_pt_name_incl 1 (0x1…

基于vue框架的财务室发票管理系统设计与实现946m1(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;财务,发票数据 开题报告内容 基于Vue框架的财务室发票管理系统设计与实现开题报告 一、开题报告名称 基于Vue框架的财务室发票管理系统设计与实现 二、研究背景与意义 在现代企业财务管理中&#xff0c;发票管理是一项至关重要的工…

源代码安全管理:深信达SDC沙盒防泄密软件的创新与应用

在数字化时代&#xff0c;源代码作为软件开发的核心资产&#xff0c;其安全性直接关系到企业的竞争力和市场地位。源代码的泄露不仅可能导致知识产权的损失&#xff0c;还可能引发安全漏洞&#xff0c;给企业带来不可估量的损害。因此&#xff0c;源代码安全管理成为了企业信息…

杰发科技AC7801——Flash模拟EEP内存(2)_备份

1. 默认配置在1000个地址存储1000个数据 配置如下 计算地址 查看地址内容&#xff0c;等到打印完成 计算符合&#xff0c;从0-999共计1000 2. 修改配置在65536地址存储65536个数据 配置还是这个 因为传进去的地址是uint16_t&#xff0c;因此最大值是65536&#xff0c;写65536…

大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

代码随想录 刷题记录-19 动态规划(3)完全背包理论、习题

一、完全背包理论 52. 携带研究材料 有N种物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完…

(二) 初入MySQL 【数据库管理】

一、SQL语言分类 DDL&#xff1a;数据定义语言&#xff0c;用于创建数据库对象&#xff0c;如库、表、索引等 DML&#xff1a;数据操纵语言&#xff0c;用于对表中的数据进行管理,用来插入、删除和修改数据库中的数据 DQL&#xff1a;数据查询语言&#xff0c;用于从数据表中查…