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

2024-02-05 10:36

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

1、101. 对称二叉树

        检查是否对称,其实就是检查左节点等不等于右节点,我们可以用递归来做。

        如果左右节点都为null,说明肯定对称呀,返回true。

        如果一个为null一个不为null,或者左右的值不相等,则为false。(这里简化一下,比如

left==null&&right!=null可以只写left==null,因为如果都为null,会进入第一个if)。

        如果两个值相等,不代表一定对称,还需要继续检查左节点的左节点和右节点的右节点、左节点的右节点和右节点的左节点是否相等。

class Solution {public boolean isSymmetric(TreeNode root) {return check(root.left, root.right);}boolean check(TreeNode left, TreeNode right){if(left == null && right == null){return true;}if(left == null || right == null || left.val != right.val){return false;}return check(left.left, right.right) && check(left.right, right.left);}
}

2、104. 二叉树的最大深度

递归解法

要求这棵树的最大深度,我们只需要求左子树和右子树的深度,然后取最大值加一就好,同样地对每个节点都如此,于是就可以用递归来解。

class Solution {public int maxDepth(TreeNode root) {if(root == null){return 0;}if(root.left == null && root.right == null){return 1;}return Math.max(maxDepth(root.left), maxDepth(root.right))+1;}
}

迭代解法

        这个解法实际上就是改造一下非递归后序遍历的代码,因为每次遍历都会将节点入栈,我们只需要在弹栈之前,记录一下栈的大小,取最大值就好。

class Solution {public int maxDepth(TreeNode root) {LinkedList<TreeNode> stack = new LinkedList<>();TreeNode pop = null;int ans = 0;while(root != null || !stack.isEmpty()){if(root != null){stack.push(root);root = root.left;}else{ans = Math.max(ans, stack.size());TreeNode peek = stack.peek();if(peek.right == null || peek.right == pop){pop = stack.pop();}else{root = peek.right;}}}return ans;}
}

3、111. 二叉树的最小深度

递归解法

        一开始我想着和第2题一个思路,结果发现这样不行。比如这种退化成链表的树

如果直接套用最大深度的代码,会返回1

        所以我们需要判断一下,如果左子树深度是0,那么就返回右子树+1的深度,对于右子树同理。

class Solution {public int minDepth(TreeNode root) {if(root == null) return 0;if(root.left == null && root.right == null) return 1;int left = minDepth(root.left);int right = minDepth(root.right);if(left == 0) return right+1;else if(right == 0) return left+1;else return Math.min(left, right) + 1; }
}

层序遍历

        最大深度也可以用层序遍历来写,因为层序遍历就是遍历每一层嘛,最大深度就遍历到最后一层,最小深度就遍历到第一个叶子节点就好了。

        我们用队列来实现,每次拓展结点的时候都检查一下是否有左右节点,如果都没有,就可以返回层数了。

class Solution {public int minDepth(TreeNode root) {if(root == null) return 0;LinkedList<TreeNode> q = new LinkedList<>();int cnt = 0;q.offer(root);while(!q.isEmpty()){cnt++;int len = q.size();for(int i = 0; i < len; i++){boolean f = true;TreeNode t = q.poll();if(t.left != null){q.offer(t.left);f = false;}if(t.right != null){q.offer(t.right);f = false;}if(f) return cnt;}}return cnt;}
}

4、 226. 翻转二叉树

举个例子,如果要翻转如下的树:

先交换2、3:

然后交换3的孩子节点、2的孩子节点

每一步的操作都是一样的,于是我们就能用递归解决。

class Solution {public TreeNode invertTree(TreeNode root) {invert(root);return root;}void invert(TreeNode node){if(node == null) return;TreeNode t = node.left;node.left = node.right;node.right = t;invert(node.left);invert(node.right);}
}

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



http://www.chinasem.cn/article/680634

相关文章

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

💥大家在面试大模型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版