代码随想录算法刷题训练营day19

代码随想录算法刷题训练营day19:LeetCode(404)左叶子之和、LeetCode(112)路径总和、LeetCode(113)路径总和 II、LeetCode(105)从前序与中序遍历序列构造二叉树、LeetCode(106)从中序与后序遍历序列构造二叉树

LeetCode(404)左叶子之和
题目
在这里插入图片描述

代码

/**
 * 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) {
        //int sum=0;
        //递归条件变化一下
        if(root==null){
            return 0;
        }
        if(root.left==null&&root.right==null){
            return 0;
        }
        //int sum=0;
        int result=sumOfLeftLeavesTest(root);
        return result;
    }
    public int sumOfLeftLeavesTest(TreeNode root){
        if(root==null){
            return 0;
        }
        if(root.left==null&&root.right==null){
            return 0;
        }
        int leftSum=sumOfLeftLeavesTest(root.left);//此时是左子树,同样也是叶子节点
        int rightSum=sumOfLeftLeavesTest(root.right);
        int leftValue=0;
        if(root.left!=null&&root.left.left==null&&root.left.right==null){//空指针异常问题
            leftValue=root.left.val;
        }
        int sum=leftSum+rightSum+leftValue;
        return sum;
    }
}

LeetCode(112)路径总和
题目
在这里插入图片描述

代码

import java.util.ArrayList;
import java.util.List;

/**
 * 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 hasPathSum(TreeNode root, int targetSum) {
        //采用前序遍历,把二叉树的所有路径取出来,放到集合通过遍历集合读出路径和
        List<List> pathDate=new ArrayList<>();
        List<Integer> paths=new ArrayList<>();
        //定义一个获取路径的函数
        getPaths(root,pathDate,paths);
        for(int i=0;i<pathDate.size();i++){
            List<Integer> path=pathDate.get(i);
            int sum=0;
            for(int j=0;j<path.size();j++){
                sum=sum+path.get(j);
            }
            if(sum==targetSum){
                return true;
            }
        }
        return false;
    }
    public void getPaths(TreeNode root,List<List> pathDate,List<Integer> paths){
        //设置终止条件
        if(root==null){
            return;
        }
        //前序遍历----到根节点进行判断---不然如果仅有一个节点,加入不了根结点数据
        paths.add(root.val);
        //判断到叶子节点的时候,将存储的路径数据放到集合里面
        if(root.left==null&&root.right==null){
            //将路径存储到pathDate中
            List<Integer> date = new ArrayList<>();
            date.addAll(paths);//拷贝数据----引用型数据不能直接赋值
            pathDate.add(date);
        }
        //遍历左子树
        if(root.left!=null){
            getPaths(root.left, pathDate, paths);
            //回溯
            paths.remove(paths.size()-1);
        }
        //遍历右子树
        if(root.right!=null){
            getPaths(root.right, pathDate, paths);
            //回溯
            paths.remove(paths.size()-1);
        }
    }
}

LeetCode(113)路径总和 II
题目
在这里插入图片描述

代码

import java.util.ArrayList;
import java.util.List;

/**
 * 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<List<Integer>> pathSum(TreeNode root, int targetSum) {
        List<List> datePath=new ArrayList<>();//存放所有路径数据
        List<Integer> paths=new ArrayList<>();//存放遍历路径数据
        List<List<Integer>> resultPath=new ArrayList<>();//存放结果路径数据
        getTreePath(root,datePath,paths);
        for(int i=0;i<datePath.size();i++){
            List<Integer> path=new ArrayList<>();
            path=datePath.get(i);
            int sum=0;
            for(int j=0;j<path.size();j++){
                sum=sum+path.get(j);
            }
            if(sum==targetSum){
                resultPath.add(path);
            }
        }

        return resultPath;

    }
    //定义获取树路径的函数
    public void getTreePath(TreeNode root,List<List> datePath,List<Integer> paths){
        if(root==null){
            return;//终止条件1---防止空节点异常
        }
        //收尾路径----先通过先序遍历
        paths.add(root.val);//遍历根节点,保证有数据
        if(root.left==null&&root.right==null){
            List<Integer> data=new ArrayList<>();
            data.addAll(paths);
            datePath.add(data);
        }
        //遍历左子树
        if(root.left!=null){
            getTreePath(root.left, datePath, paths);
            //回溯
            paths.remove(paths.size()-1);
        }
        //遍历右子树
        if(root.right!=null){
            getTreePath(root.right, datePath, paths);
            //回溯
            paths.remove(paths.size()-1);
        }
    }
}

LeetCode(105)从前序与中序遍历序列构造二叉树
题目
在这里插入图片描述

代码

import java.util.Arrays;

/**
 * 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 TreeNode buildTree(int[] preorder, int[] inorder) {
        //切割+递归
        //终止条件
        if(preorder.length==0){
            return null;
        }
        //取根节点
        int rootdate=preorder[0];
        TreeNode root=new TreeNode(rootdate);
        int index=0;
        //找出中序遍历数组的中间节点
        for (int i = 0; i < inorder.length; i++) {
            if(rootdate==inorder[i]){
                index=i;
            }    
        }
        //切割中序
        int[] leftInorder=Arrays.copyOfRange(inorder, 0, index);
        int[] rightInorder=Arrays.copyOfRange(inorder, index+1, inorder.length);
        //切割后续
        int dateLength=leftInorder.length;
        int[] leftPreorder=Arrays.copyOfRange(preorder, 1, 1+dateLength);
        int[] rightPreorder=Arrays.copyOfRange(preorder, 1+dateLength, preorder.length);
        //继续递归
        root.left=buildTree(leftPreorder, leftInorder);
        root.right=buildTree(rightPreorder, rightInorder);
        return root;

    }
}

LeetCode(106)从中序与后序遍历序列构造二叉树
题目
在这里插入图片描述

代码

import java.util.Arrays;

/**
 * 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 TreeNode buildTree(int[] inorder, int[] postorder) {
        //方法:进行切割中序和后序
        //判断树是否为空树
        if(inorder.length==0){
            return null;//终止条件
        }
        //后序遍历数组的最后一个数字是根节点
        //把根节点高处来,便于切割中序数组和中序数组
        //递归终止条件
        int index=0;
        TreeNode root=new TreeNode();
        int indexRoot=postorder[postorder.length-1];
        /* if(postorder.length>0){//设置
            root.val=indexRoot;
            //切割中序数组      
        } */
        root.val=indexRoot;
        for (int i = 0; i < inorder.length; i++) {
            if(indexRoot==inorder[i]){
                index=i;
                break;
            }  
        }  
        //获取中间索引位置
        //获取中序遍历中左子树的中序遍历
        int[] leftInorder=Arrays.copyOfRange(inorder, 0, index);
        int[] rightInorder=Arrays.copyOfRange(inorder, index+1, inorder.length);
        //切割后序遍历数组
        int leftLength=leftInorder.length;
        int[] leftPostorder=Arrays.copyOfRange(postorder, 0, leftLength);
        int[] rightPostorder=Arrays.copyOfRange(postorder, leftLength, postorder.length-1);//根据下标截取数组
        //递归开始,将左子树,仍进去
        root.left=buildTree(leftInorder, leftPostorder);
        root.right=buildTree(rightInorder, rightPostorder);
        return root;
    }
}

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

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

相关文章

shell - 正则表达式和grep命令和sed命令

一.正则表达式概述 1.正则表达式定义 1.1 定义 使用字符串描述、匹配一系列符合某个规则的字符串 1.2 了解 普通字符&#xff1a; 大小写字母、数字、标点符号及一些其它符号元字符&#xff1a; 在正则表达式中具有特殊意义的专用字符 1.3 层次分类 基础正则表达式扩展正…

《机器人SLAM导航核心技术与实战》第1季:第7章_SLAM中的数学基础

视频讲解 【第1季】7.第7章_SLAM中的数学基础-视频讲解 【第1季】7.1.第7章_SLAM中的数学基础_SLAM发展简史-视频讲解 【第1季】7.2.第7章_SLAM中的数学基础_SLAM中的概率理论-视频讲解 【第1季】7.3.第7章_SLAM中的数学基础_估计理论-视频讲解 【第1季】7.4.第7章_SLAM中的…

我用Rust开发Rocketmq name server

我是蚂蚁背大象(Apache EventMesh PMC&Committer)&#xff0c;文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm&#xff0c;文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com 1. Rocketmq-rust namesrv概述 经过一个多月的开发&#xff0c;终…

ssm学生选课系统

学生选课系统&#xff0c;java项目&#xff0c;ssm项目&#xff0c;增删改查均已实现。eclipse和idea都能打开运行。 系统分为3部分学生选课管理&#xff0c;教师管理&#xff0c;管理员管理 主要功能&#xff1a; 管理员&#xff1a;课程管理、学生管理、教师管理 教师&am…

Unity打包Android,jar文件无法解析的问题

Unity打包Android&#xff0c;jar无法解析的问题 介绍解决方案总结 介绍 最近在接入语音的SDK时&#xff0c;发现的这个问题. 当我默认导入这个插件的时候&#xff0c;插件内部的文件夹&#xff08;我下面话红框的文件夹&#xff09;名字原本为GCloudVoice&#xff0c;这时候我…

利用Python中的集合去除列表中重复的元素

题目描述 已知列表li_one[1,2,1,2,3,5,4,3,5,7,4,7,8]&#xff0c;编写程序实现删除列表li_one中重复数据的功能。 分析 集合的特点是集合内元素无序性&#xff0c;集合内元素不可重复&#xff0c;因此可以利用不可重复的特性来解决该问题。 程序代码 li_one[1,2,1,2,3,5,…

Day01-变量和数据类型课后练习-参考答案

文章目录 1、输出你最想说的一句话&#xff01;2、定义所有基本数据类型的变量和字符串变量3、用合适类型的变量存储个人信息并输出4、定义圆周率PI5、简答题 1、输出你最想说的一句话&#xff01; 编写步骤&#xff1a; 定义类 Homework1&#xff0c;例如&#xff1a;Homewo…

已实现:vue、h5项目如何使用echarts实现雷达图、六边形图表

说实话&#xff0c;要说图表里&#xff0c;最强的应该属于echarts了&#xff0c;不管是接入难度上&#xff0c;还是样式多样性上&#xff0c;还有社区庞大程度上&#xff0c;都是首屈一指的&#xff0c;反观有的人习惯用chart.js了&#xff0c;这个无可厚非&#xff0c;但是如果…

elementui中的tree自定义图标

需求&#xff1a;实现如下样式的树形列表 自定义树的图标以及点击时&#xff0c;可以根据子级的关闭&#xff0c;切换图标 <el-tree :data"treeList" :props"defaultProps"><template #default"{ node, data }"><span class&quo…

校园圈子论坛系统--APP小程序H5,前后端源码交付,支持二开!uniAPP+PHP书写!

随着移动互联网的快速发展&#xff0c;校园社交成为了大学生们日常生活中重要的一部分。为了方便校园内学生的交流和互动&#xff0c;校园社交小程序逐渐走入人们的视野。本文将探讨校园社交小程序的开发以及其带来的益处。 校园社交小程序的开发涉及许多技术和设计方面。首先&…

一进一出超薄 V/F(I/F)频率脉冲信号转换器

一进一出超薄 V/F(I/F)频率脉冲信号转换器特点&#xff1a; ◆低成本,超薄设计,国际标准DIN35导轨安装 ◆三端隔离(输入、输出、工作电源间相互隔离) ◆高精度等级(0.1% F.S&#xff0c;0.2% F.S) ◆高线性度(0.1% F.S) ◆高隔离耐压(3000VDC/60S) ◆极低温度漂移(80PPM/℃) ◆…

LLM之makeMoE:makeMoE的简介、安装和使用方法、案例应用之详细攻略

LLM之makeMoE&#xff1a;makeMoE的简介、安装和使用方法、案例应用之详细攻略 目录 makeMoE的简介 1、对比makemore 2、相关代码文件 makMoE_from_Scratch.ipynb文件 makeMoE_Concise.ipynb文件 makeMoE的安装和使用方法 1、基于Databricks使用单个A100进行开发 makeM…

2024年新提出的算法:(凤头豪猪优化器)冠豪猪优化算法Crested Porcupine Optimizer(附Matlab代码)

本次介绍一种新的自然启发式元启发式算法——凤头豪猪优化器(Crested Porcupine Optimizer&#xff0c;CPO)。该成果于2024年1月发表在中科院1区SCI top期刊Knowledge-Based Systems&#xff08;IF 8.8&#xff09;上。 1、简介 受到凤头豪猪&#xff08;CP&#xff09;各种…

qt学习:Table widget控件

目录 头文件 实战 重新配置ui界面 添加头文件 在构造函数中添加初始化 显示方法 该实例是在sqlite项目上添加qt学习&#xff1a;QTSQL连接sqlite数据库增删改查-CSDN博客 头文件 #include <QTableWidgetItem> 实战 重新配置ui界面 用法介绍&#xff0c;可以双击…

Web3技术革新:重新定义在线体验

互联网的不断演进塑造了我们的数字生活&#xff0c;而Web3技术的涌现正带来一场前所未有的变革。本文将深入探讨Web3技术的创新&#xff0c;以及它如何重新定义和提升我们的在线体验。 Web3技术的基本概念 Web3是互联网的第三个时代&#xff0c;它将去中心化、区块链、智能合约…

计算机二级C语言公共基础知识

数据结构和算法 一 算法 算法是指对解决方案准确而完整的描述&#xff0c;简单的说&#xff0c;算法就是解决问题的操作步骤&#xff08;有一个很著名的公式 “程序数据结构算法”&#xff09; 算法不等于数学上的计算方法&#xff0c;也不等于程序&#xff08;程序可以描述…

Datawhale 组队学习之大模型理论基础Task9 大模型法律

第11章 大模型法律 11.1 简介 此内容主要探讨法律对大型语言模型的开发和部署有何规定。 先看看法律的特点&#xff1a; 法律就如我国法律教材所给出的一样&#xff0c;有依靠国家强制力保证实施的特点。 而法律在大模型中也是不可或缺的&#xff0c;缺少了法律的约束&…

使用Hutool工具包解析、生成XML文件

说明&#xff1a;当我们在工作中需要将数据转为XML文件、或者读取解析XML文件时&#xff0c;使用Hutool工具包中的XMLUtil相关方法是最容易上手的方法&#xff0c;本文介绍如何使用Hutool工具包来解析、生成XML文件。 开始之前&#xff0c;需要导入Hutool工具包的依赖 <de…

通过Demo学WPF—数据绑定(一)✨

前言✨ 想学习WPF&#xff0c;但是看视频教程觉得太耗时间&#xff0c;直接看文档又觉得似懂非懂&#xff0c;因此想通过看Demo代码文档的方式进行学习。 准备✨ 微软官方其实提供了WPF的一些Demo&#xff0c;地址为&#xff1a;microsoft/WPF-Samples: Repository for WPF …

MySQL:MVCC原理详解

MySQL是允许多用户同时操作数据库的&#xff0c;那么就会出现多个事务的并发场景。那么再并发场景会出现很多问题&#xff1a;脏读、不可重复读、幻读的问题。 而解决这些问题所用到的方法就是&#xff1a;MVCC 多版本并发控制。而这个MVCC的实现是基于read_view、undoLog 如…