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

2024-02-07 00:20

本文主要是介绍双非本科准备秋招(18.1)—— 力扣二叉树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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;}
}

这篇关于双非本科准备秋招(18.1)—— 力扣二叉树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

力扣第347题 前K个高频元素

前言 记录一下刷题历程 力扣第347题 前K个高频元素 前K个高频元素 原题目: 分析 我们首先使用哈希表来统计数字出现的频率,然后我们使用一个桶排序。我们首先定义一个长度为n+1的数组,对于下图这个示例就是长度为7的数组。为什么需要一个长度为n+1的数组呢?假如说总共有三个数字都为1,那么我们需要把这个1放在数组下标为3的位置,假如说数组长度为n,对于这个例子就是长度为3,那么它的

第十章 【后端】环境准备(10.4)——Vagrant

10.4 Vagrant Vagrant 官网 Vagrant 镜像仓库 下载 安装 直接 install。 设置环境变量 Vagrant 默认将镜像保存在用户文件夹的 .vagrant.d 目录下,若用户文件夹在C盘,下载的镜像文件会大量占用C盘空间。设置环境变量 VAGRANT_HOME 后,Vagrant 会将镜像保存到环境变量指定的文件夹下。

OpenStack离线Train版安装系列—2计算节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack离线Train版安装系列—1控制节点-环境准备

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版