day24【代码随想录】平衡二叉树、二叉树的所有路径、路径总和||、路径总和、求根节点到叶节点数字之和

news2024/10/6 8:38:22

文章目录

  • 前言
  • 一、平衡二叉树(力扣110)
  • 二、二叉树的所有路径(力扣257)
    • 1、递归法
    • 2、迭代法
  • 三、路径总和 II(力扣113)
  • 四、路径总和(力扣112)
  • 五、求根节点到叶节点数字之和(力扣129)


前言

1、平衡二叉树
2、二叉树的所有路径
3、路径总和||
4、路径总和
5、求根节点到叶节点数字之和


一、平衡二叉树(力扣110)

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
在这里插入图片描述
递归

class Solution {
    /**
    当发现任何一个结点的高度差超过1时,就不是平衡二叉树
     */
    public boolean isBalanced(TreeNode root) {
        int res = getHeight(root);
        if(res==-1)return false;
        else return true;
    }
    public int getHeight(TreeNode node){
        if(node==null) return 0;
        int leftDepth=getHeight(node.left);
        if(leftDepth==-1) return -1;
        int rightDepth=getHeight(node.right);
        if(rightDepth==-1) return -1;

        if(Math.abs(leftDepth-rightDepth)>1) return -1;
        else return 1+Math.max(leftDepth,rightDepth);
    }
}

二、二叉树的所有路径(力扣257)

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
在这里插入图片描述

1、递归法

一图胜千言
在这里插入图片描述

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 root,List<Integer> paths,List<String> res){
        //添加结点 (最后叶子节点还没上车)
        paths.add(root.val);
        if(root.left==null && root.right==null){ //叶子节点
            StringBuilder sb = new StringBuilder();
            for(int i = 0;i<paths.size()-1;i++){
                sb.append(paths.get(i)).append("->"); //这条路径遍历结束
            }
            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); //回溯
        }
    }
}

2、迭代法

非递归的方式,我们可以依然可以使用前序遍历的迭代方式来模拟遍历路径的过程

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        //迭代法 前序遍历 根左右
        List<String> res = new ArrayList<>();
        if(root==null){
            return res;
        }
        Stack<Object> stack = new Stack<>();
        stack.push(root);
        stack.push(root.val+"");
        while(!stack.isEmpty()){
            String path = (String)stack.pop();
            TreeNode node = (TreeNode)stack.pop();
            if(node.left==null&&node.right==null){
                res.add(path);
            }

            if(node.right!=null){
                stack.push(node.right);
                stack.push(path+"->"+node.right.val);
            }
            if(node.left!=null){
                stack.push(node.left);
                stack.push(path+"->"+node.left.val);
            }
        }
        return res;
    }
}

在这里插入图片描述

三、路径总和 II(力扣113)

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。
在这里插入图片描述
思路:
与求 二叉树的所有路径 这道题目类似

class Solution {
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        //递归法
        List<List<Integer>> res = new ArrayList<>();
        if(root==null){
            return res;
        } 
        List<Integer> paths = new ArrayList<>();
        traversal(root,paths,res,targetSum);
        return res;
    }
    public void traversal(TreeNode root,List<Integer> paths,List<List<Integer>> res,Integer targetSum){
        paths.add(root.val);
        if(root.left==null && root.right==null){
            int sum=0;
            List<Integer> item = new ArrayList<>();
            //叶子节点 收集结果
            for(int i=0;i<paths.size();i++){
                sum +=paths.get(i);
                item.add(paths.get(i));
            }
            if(sum==targetSum){
                res.add(item);
            }
            return ;
        }
        if(root.left!=null){
            traversal(root.left,paths,res,targetSum);
            paths.remove(paths.size() - 1);// 回溯
        }
        if(root.right!=null){
            traversal(root.right,paths,res,targetSum);
            paths.remove(paths.size() - 1);// 回溯
        }
    }
}

在这里插入图片描述

四、路径总和(力扣112)

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。
在这里插入图片描述
思路:
比第三题更简单一些

class Solution {
    int res = 0;
    public boolean hasPathSum(TreeNode root, int targetSum) {

        if(root==null){
            return false;
        }
        List<Integer> paths = new ArrayList<>();
        traversal(root,paths,targetSum);
        return res>0 ? true : false;
    }
    public void traversal(TreeNode root,List<Integer> paths,int targetSum){
        paths.add(root.val);
        if(root.left==null&&root.right==null){
            int sum = 0;
            //到了叶子结点 收集结果
            for(int i = 0;i<paths.size();i++){
                sum += paths.get(i);
            }
            if(sum==targetSum) res++;
        }
        if(root.left!=null){
            traversal(root.left,paths,targetSum);
            paths.remove(paths.size()-1); //回溯
        }
        if(root.right!=null){
            traversal(root.right,paths,targetSum);
            paths.remove(paths.size()-1); //回溯
        }
    }
}

在这里插入图片描述

五、求根节点到叶节点数字之和(力扣129)

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
在这里插入图片描述
思路:
需要注意的点就是 整条路径上的值求和这个函数功能实现

class Solution {
    List<Integer> paths = new ArrayList<>();
    int res = 0;
    public int sumNumbers(TreeNode root) {
        if(root==null) return 0;
        paths.add(root.val);
        traversal(root);
        return res;


    }
    public void traversal(TreeNode root){
        if(root.left==null && root.right==null){
            res += listToInt(paths);
            return ;
        }
        if(root.left!=null){
            paths.add(root.left.val);
            traversal(root.left);
            paths.remove(paths.size()-1);//回溯
        }
        if(root.right!=null){
            paths.add(root.right.val);
            traversal(root.right);
            paths.remove(paths.size()-1);//回溯
        }
        return ;
    }
    public int listToInt(List<Integer> path){
        int sum = 0;
        for(Integer num:path){
            sum = sum*10+num;
        }
        return sum;
    }
}

在这里插入图片描述


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

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

相关文章

【图像配准】SIFT图像配准【含Matlab源码 1007期】

⛄一、SIFT配准简介 SIFT即尺度不变特征变换&#xff0c;是用于图像处理领域的一种描述。这种描述具有尺度不变性&#xff0c;可在图像中检测出关键点&#xff0c;是一种局部特征描述子。 1 SIFT算法特点&#xff1a; &#xff08;1&#xff09;具有较好的稳定性和不变性&…

[附源码]计算机毕业设计Node.js博客管理系统(程序+LW)

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

springboot多数据源---2事务

一、多数据源事务控制 在多数据源下&#xff0c;由于涉及到数据库的多个读写。一旦发生异常就可能会导致数据不一致的情况&#xff0c; 在这种情况希望使用事务 进行回退。 但是Spring的声明式事务在一次请求线程中只能使用一个数据源进行控制 但是对于多源数据库&#xff1a; …

C#语言实例源码系列-设置桌面背景

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

36寸便携旅行小吉他怎么选?八款高性价比颜值的儿童初学女生新手入门吉他品牌推荐!

本期介绍民谣吉他里的36英寸的Mini桶型&#xff0c;主要适用于小孩或者喜欢带琴外出旅行的朋友们&#xff0c;也被称为儿童吉他或者旅行吉他。这些吉他基本上也是配备标准指板的&#xff0c;演奏体验与大吉他一样。相比桶型较大的吉他&#xff0c;其音量会 相对较小&#xff0c…

zibll子比主题6.7用户徽章功能详解及配置教程[V6.7新功能]

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 用户徽章功能是现在很多社交类网站和app必不可少的功能了&#xff0c;能有效的增加网站交互的趣味性。 zibll子比主题V6.7就更新了用户徽章功能&#xff0c;接下来我们就来了解一下这个…

[3D数据深度学习] (PC/服务器集群cluster)CPU内存/GPU显存限制及解决办法

[3D数据深度学习] &#xff08;PC/服务器集群cluster&#xff09;内存/显存参数设置1. 硬件配置推荐2. 深度学习流程及遇到的问题3. CPU内存限制及参数设置4. GPU显存限制及参数设置3D数据的深度学习目前研究远不如2D深度学习成熟&#xff0c;其中最大的一个原因之一就是收到硬…

【跨层注意力:多层次融合】

Multi-level features fusion via cross-layer guided attention for hyperspectral pansharpening &#xff08;基于跨层注意力引导的多层次特征融合高光谱全色锐化&#xff09; 近年来&#xff0c;卷积神经网络&#xff08;CNN&#xff09;在计算机视觉中的成功应用引起了人…

新手入门吉他买什么牌子好?有哪些值得推荐的吉他品牌,附上初学者吉他选购攻略!【避坑指南】

在选购吉他之前&#xff0c;大家必须提前了解的一些关于吉他的知识&#xff0c;提前做好功课&#xff0c;不怕挑选不到适合的吉他&#xff0c;新手入门吉他怎么选&#xff1f;怎么选到适合自己的吉他&#xff1f;带着这些问题在这里我将详细地给大家一一讲解&#xff0c;同时最…

如何做好客户精细化管理?

很多人都知道客户精细化管理的重要性&#xff0c;但并不是所有人都掌握客户精细化管理的科学方法。 目前&#xff0c;客户精细化管理最常用的方法是基于RFM模型的客户细分方法。 RFM分析是客户关系分析中一种简单实用客户分析方法&#xff0c;他将最近一次消费、消费频率、消…

Java项目:基于ssm智能餐厅管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目主要分为服务员、厨师、收银员、经理四种角色&#xff1b; 主要功能包括&#xff1a; 客户可以根据自己的要求去选择菜品&#xff0c;厨师…

23种设计模式的分类和应用场景总结【设计模式】

23种设计模式的分类和应用场景总结【设计模式】设计模式分类创建型模式结构型模式行为型模式设计模式的几种原则应用场景总结各种模式的详细介绍创建型模式设计模式分类 23种设计模式可以分为三大类&#xff1a;创建型模式、结构型模式和行为型模式。 创建型模式 &#x1f34…

(附源码)SSM高考志愿智能选择系统 毕业设计 134565

SSM高考志愿智能选择系统 摘 要 高中教育的普及使得每年高考人数攀升&#xff0c;与此同时&#xff0c;信息不对称会使部分考生处于劣势&#xff0c;造成获录学校或专业性价比不高、报录比偏低、复读率增高、考研热等问题。针对这些情况&#xff0c;本文设计并实现了高考志愿智…

【时钟识别】Hough变换指针式时钟识别【含GUI Matlab源码 2085期】

⛄一、简介 1 仪表示数识别流程 基于刻度准确定位的指针式仪表示数识别方法包括预处理、指针检测、刻度定位、油位计表盘中心拟合与仪表读数计算5个部分。该方法无需预先添加任何表盘信息,算法流程如图2所示。整个流程分为两步且同时进行——第1步,将油位计图像进行灰度化和边…

DPDK技术原理概述

DPDK 基本技术指标准的 DPDK 数据平面开发包和 I/O 转发实现技术&#xff0c;本次将概述该部分的主要技术原理。 1 技术原理与架构 由于采用软件转发和软件交换技术&#xff0c;单服务器内部的转发能力是 NFV 系统的主要性能瓶颈。在各类高速转发的 NFV 应用中&#xff0c;数…

赣货通全球桥接江西制造全球开花,贸易强国供应链出海江西在奋进

“赣货通全球”平台是什么? “赣货通全球”平台是江西制造进入全球供应链的数字贸易平台&#xff0c;平台免费为江西制造打造永不落幕线上国际化“赣品展”。核心的后台功能为企业用户提供大数据获客及营销功能&#xff0c;同时为企业提供贸易全流程的第三方外贸综合服务&…

Ubuntu18.04复现mmdetection3d

文章目录一、环境搭建二、测试demo三、数据预处理四、训练参考一、环境搭建 从零配置深度学习环境参考&#xff1a;ubuntu18.04 AnnacondaCUDA10.2CuDNN7.6.5使用anaconda创建虚拟环境 conda create -n open-mmlab3d python3.8 conda activate open-mmlab3d安装torch 先从官网…

自然语言处理竞赛相关比赛项目、比赛经验、工具、算力平台资源分享

本资源主要收录NLP竞赛经验贴、通用工具、学习资料等&#xff0c;本项目源于2020年7月一次竞赛的经历&#xff0c;当时在找参考资料时遇到了很多困难&#xff0c;包括内容分散、质量不高等。2021年3月开始更新本项目&#xff0c;志在帮助NLPer提升模型性能。2021年6月开放本项目…

大一Web课程设计 基于HTML家乡主题网页项目的设计与实现——中国牡丹之都山东菏泽(6页)

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

MySQL高级【索引概述索引结构】

目录 索引概述 无索引演示&#xff1a;一种表没有索引的查找方式 有索引演示&#xff1a;以二叉树进行演示 索引的优缺点 索引结构 二叉树&#xff1a; B-Tree&#xff08;多路平衡查找树&#xff09; BTree树 Hash数据结构 索引概述 索引它是一种有序的数据结构&…