双非本科准备秋招(18.1)—— 力扣二叉树

news2024/10/5 18:32:44

1、404. 左叶子之和

方法一:

        可以在父节点判断一下,如果左子树不为null,并且左子树没有左右子树,说明这是个左叶子节点。

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if(root == null) return 0;

        int LV = sumOfLeftLeaves(root.left);
        int RV = sumOfLeftLeaves(root.right);

        int t = 0;
        if (root.left != null && root.left.left == null && root.left.right == null) { 
            t = root.left.val;
        }

        return t+LV+RV;
    }
}

 方法二,找bug

        一开始我用的递归,用布尔值传值,于是我写了如下代码。

class Solution {
    static int ans = 0;
    public int sumOfLeftLeaves(TreeNode root) {
        preOrder(root, false);

        return ans;
    }
    static void preOrder(TreeNode root, boolean isLeft){
        if(root == null) return;
        if(isLeft && root.left == null && root.right == null){
            ans += root.val;
            return;
        }
        preOrder(root.left, true);
        preOrder(root.right, false);
    }
}

        这个测试用例竟然会输出24。

        想了一天,晚上突然明白了,测试用例1答案是24,测试用例2答案应该是0,但是为什么是24呢?因为测试用例2答案在第一个基础上,也就是24+0 = 24

        而我的ans变量是static的,也就是所有实例共享的,把代码改成下面这样就过了。

class Solution {
    int ans = 0;
    public int sumOfLeftLeaves(TreeNode root) {
        preOrder(root, false);

        return ans;
    }
    void preOrder(TreeNode root, boolean isLeft){
        if(root == null) return;
        if(isLeft && root.left == null && root.right == null){
            ans += root.val;
            return;
        }
        preOrder(root.left, true);
        preOrder(root.right, false);
    }
}

        

2、513. 找树左下角的值

        这个题应该挺好想的,左下角是最底层,最左边的值,用层序遍历就很好实现,遍历到最后一层记录第一个值就是答案。

class Solution {
    public int findBottomLeftValue(TreeNode root) {
        //层序遍历 最后一层 第一个节点
        LinkedList<TreeNode> q = new LinkedList<>();
        int ans = 0;
        if(root == null) return 0;
        q.offer(root);
        while(!q.isEmpty()){
            int len = q.size();
            for(int i = 0; i < len; i++){
                TreeNode t = q.poll();
                if(i == 0) ans = t.val;
                if(t.left != null){
                    q.offer(t.left);
                }
                if(t.right != null){
                    q.offer(t.right);
                }
            }
        }
        return ans;
    }
}

3、112. 路径总和

        跟昨天的输出路径题一个套路(257. 二叉树的所有路径),核心还是判断是不是叶子节点,当左右子树都为null并且传的值等于target的时候说明找到了,为了保证不出现空指针异常,每次递归都要判断一下。

class Solution {
    boolean f = false;
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root == null) return f;
        preOrder(root, targetSum, 0);
        return f;
    }
    void preOrder(TreeNode root, int target, int n){
        if(f) return;

        n += root.val;
        if(root.left == null && root.right == null && n == target){
            f = true;
            return;
        }

        if(root != null && root.left != null) preOrder(root.left, target, n);
        if(root != null && root.right != null) preOrder(root.right, target, n);
    }
}

4、654. 最大二叉树

        跟昨天做的根据前序中序构造树一个思路,代码都很像,for循环找到最大值,然后根据最大值位置划分左右子树递归地遍历左右子树,左子树范围0——index,右子树范围index+1——length。

        但是要注意判断一下index是否是边界,也就是为0或length-1的时候,左子树或右子树直接就是null了。

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        int r = -1, index = 0;
        for(int i = 0; i < nums.length; i++){
            if(nums[i] > r){
                r = nums[i];
                index = i;
            }
        }
        TreeNode root = new TreeNode(r);
        if(index == 0) root.left = null; 
        else root.left = constructMaximumBinaryTree(Arrays.copyOfRange(nums, 0, index));
        if(index == nums.length-1) root.right = null;
        else root.right = constructMaximumBinaryTree(Arrays.copyOfRange(nums, index+1, nums.length));
        return root;
    }
}

5、617. 合并二叉树

        核心在于如何同步遍历两个二叉树。

        每次把结果都加到root1这棵树上就好,节省空间。

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1 == null) return root2;
        if(root2 == null) return root1;

        root1.val += root2.val;
        root1.left = mergeTrees(root1.left, root2.left);
        root1.right = mergeTrees(root1.right, root2.right);
        
        return root1;
    }
}

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

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

相关文章

怎么把两段视频合成一个画面?教你4个合成方法

怎么把两段视频合成一个画面&#xff1f;在数字媒体时代&#xff0c;视频编辑已经成为一项必备技能。有时候&#xff0c;我们需要将两段或多段视频合并成一个画面&#xff0c;这在电影制作、自媒体内容创作、家庭相册制作等领域都有广泛应用。本文将为你介绍四种简单易行的方法…

挑战杯 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

PyTorch的10个基本张量操作

PyTorch是一个基于python的科学计算包。它的灵活性允许轻松集成新的数据类型和算法&#xff0c;并且框架也是高效和可扩展的&#xff0c;下面我们将介绍一些Pytorch的基本张量操作。 Tensors 张量Tensors是一个向量&#xff0c;矩阵或任何n维数组。这是深度学习的基本数据结构…

企业计算机服务器中了halo勒索病毒如何解密,halo勒索病毒数据恢复

对于众多的企业来说&#xff0c;数据是一个企业的发展的根基&#xff0c;通过数据可以更好地规划调整企业的发展方向&#xff0c;提高企业生产效率。但网络是一把双刃剑&#xff0c;网络技术的发展不仅会为企业带来极大便利&#xff0c;但也为企业数据安全带来严重威胁。近期&a…

谈谈BlueFS

目录 前言数据结构标识一个文件文件系统的全局记录事务记录超级块 启动流程磁盘管理读写流程创建文件流程为文件写数据把数据下刷到磁盘读流程 参考资料 前言 BlueFS具体是个什么东西呢&#xff1f; 如上图&#xff0c;在Ceph里&#xff0c;使用BlueStore作为默认的存储引擎。…

LLM(大语言模型)——大模型简介

目录 概述 发展历程 大语言模型的概念 LLM的应用和影响 大模型的能力、特点 大模型的能力 涌现能力&#xff08;energent abilities&#xff09; 作为基座模型支持多元应用的能力 支持对话作为统一入口的能力 大模型的特点 常见大模型 闭源LLM&#xff08;未公开源…

datax离线同步oracle表到clickhouse实践1

时间&#xff1a;2024.01 目录1、安装启动 oracle19c 容器 2、rpm包安装clickhouse 3、datax安装 4、datax同步 目标库根据要同步的表&#xff0c;按照clickhouse建表规范建表 编写json文件 编写增量同步shell脚本&#xff0c;加入 crond 定时任务 1、安装启动 oracle19c 容器…

关于如何在Mac上安装Windows,看这篇文章就差不多了

启动转换(Boot Camp)助手可以让你在一些Mac电脑上安装Windows并引导到其中,就像在普通电脑上一样。现代苹果硅型号(M1、M2等)不支持启动转换助手,必须使用其他方法来运行Windows。 可以在M1或M2 Mac上使用启动转换助手吗 只有当Mac上有Intel(x86)处理器时,才能使用启…

Arcgis使用过程中常见问题解决方法

Arcgis无法连接数据库/数据库连接或创建失败解决方法 最近在使用arcgis过程中出现无法连接数据库或者是无法创建数据库。连接到数据库失败&#xff1b;无法创建新的数据库&#xff0c;权限被拒绝&#xff08;如下图&#xff09;。 出现这个原因是你所用的电脑系统文件dao360.…

生存类游戏《幻兽帕鲁》从部署服务器到开始体验全过程

SteamDB数据显示&#xff0c;《幻兽帕鲁》上线24小时内&#xff0c;在线人数峰值便突破200万&#xff0c;跻身Steam历史排行榜第二位。随着热度进一步发酵&#xff0c;《幻兽帕鲁》官方发布推文称&#xff0c;游戏发售不到6天&#xff0c;销量已经突破了 800万份。欢迎大家在阿…

香港公司员工遭遇2亿港币Deepfake诈骗; 阿里巴巴Qwen1.5震撼发布;通义千问App推新功能迎佳节

&#x1f989; AI新闻 &#x1f680; 香港公司员工遭遇2亿港币Deepfake诈骗 摘要&#xff1a;近日&#xff0c;香港一家英国跨国企业的员工被Deepfake技术仿造的视频诈骗&#xff0c;损失2亿港币。骗子通过伪造高管的面貌和声音&#xff0c;用视频会议的形式命令其转账&#…

双非本科准备秋招(17.1)—— 力扣二叉树

1、257. 二叉树的所有路径 要求返回根节点到叶子节点的所有路径&#xff0c;这里用前序遍历就好。 每次递归前&#xff0c;都让字符串s加上当前节点的值和“->”&#xff0c;然后判断是否为叶子节点&#xff0c;如果是的话&#xff0c;说明这条路径是一个答案&#xff0c;因…

基于springboot实现二次元商品购物系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现二次元商品购物系统演示 摘要 时代的变化速度实在超出人类的所料&#xff0c;21世纪&#xff0c;计算机已经发展到各行各业&#xff0c;各个地区&#xff0c;它的载体媒介-计算机&#xff0c;大众称之为的电脑&#xff0c;是一种特高速的科学仪器&#xff0…

python + 蒙特卡罗 = 股市神器! 能用到A股吗?

蒙特卡罗模拟作为一种在金融领域广泛应用的强大统计技术&#xff0c;能够对金融资产&#xff08;例如股票&#xff09;的行为进行模拟建模。在本文中&#xff0c;我们将深入探讨如何在Python编程环境中实现蒙特卡罗模拟&#xff0c;以预测股票市场未来可能出现的情况。我们将利…

MySQL进阶45讲【12】为什么你的MySQL偶尔会卡一下

1 前言 平时的工作中&#xff0c;不知道大家有没有遇到过这样的场景&#xff0c;一条SQL语句&#xff0c;正常执行的时候特别快&#xff0c;但是有时也不知道怎么回事&#xff0c;它就会变得特别慢&#xff0c;并且这样的场景很难复现&#xff0c;它不只随机&#xff0c;而且持…

【Linux驱动】块设备驱动(二)—— 块设备读写(使用请求队列)

块设备的操作函数并没有类似于字符驱动中的read 和write函数&#xff0c;要实现读写操作&#xff0c;只能在请求处理函数中实现。这就分为两种&#xff0c;是否要使用请求队列&#xff0c;请求队列的主要作用是管理和调度IO请求。在以下情况中&#xff0c;一般需要用到请求队队…

Kafka 使用手册

kafka3.0 文章目录 kafka3.01. 什么是kafka&#xff1f;2. kafka基础架构3. kafka集群搭建4. kafka命令行操作主题命令行【topic】生产者命令行【producer】消费者命令行【consumer】 5. kafka生产者生产者消息发送流程Producer 发送原理普通的异步发送带回调函数的异步发送同步…

虚幻5源码版打包服务端

适用情况&#xff0c;windows系统&#xff0c;已经安装vs2022之类的&#xff0c;和UE5适配的版本 源码版使用 1.下载源码版&#xff0c;推荐下载 压缩包 tar.gz那个&#xff0c;zip和git clone我老是下载不下载来&#xff0c;只是这个压缩包要解压1个多小时… 2.点击 源码的…

C语言-4

排序算法简介 /*学习内容&#xff1a;冒泡排序&#xff08;最基本的排序方法&#xff09;选择排序&#xff08;冒泡的优化&#xff09;插入排序&#xff08;在合适的位置插入合适的数据&#xff09; *//*排序分类&#xff1a;1.内部排序待需要进行排序的数据全部存放到内存中&…

【Python基础】案例分析:电商分析

电商分析 1 案例:某年淘宝双12部分购物数据 1.1 数据&#xff1a;某年淘宝双12部分购物数据&#xff1b; 来源&#xff1a;天池数据平台 1.2 分析目的&#xff1a; 熟悉电商常用分析指标用户行为分析用户价值模型 2 熟悉数据 2.1 导入数据 import pandas as pd fpath …