二叉树的右视图(199)

class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> rightSideView(TreeNode root) {
dfs(root, 0);
return res;
}
private void dfs(TreeNode node, int depth){
if (node == null) return; if (res.size() == depth){
res.add(node.val);
} dfs(node.right, depth+1);
dfs(node.left, depth+1);
}
}
  • 分析

因为一层只需要一个节点, 以depth作为限制

二叉树展开为链表(114)

class Solution {
public void flatten(TreeNode root) {
if (root == null) return; flatten(root.left);
flatten(root.right);
TreeNode lef = root.left;
TreeNode rig = root.right; root.left = null;
root.right = lef;
TreeNode curr = root; while (curr.right != null){
curr = curr.right;
}curr.right = rig; }
}
  • 分析

将左子树截断放到右端, 再将右子树放在左子树末尾

因为递归原因, 左子树必然为链表

从前序与中序遍历序列构造二叉树(105)

class Solution {
Map<Integer, Integer> map;
public TreeNode buildTree(int[] preorder, int[] inorder) {
int n = preorder.length;
map = new HashMap<>();
for (int i = 0; i < n; i++){
map.put(inorder[i], i);
} return dfs(preorder, 0, n, 0, n);
} private TreeNode dfs(int[] preorder, int lefPre, int rigPre, int lefIn, int rigIn){
if (lefPre == rigPre) return null; int lefSize = map.get(preorder[lefPre]) - lefIn;
TreeNode lefNode = dfs(preorder, lefPre+1, lefPre+1+lefSize, lefIn, lefIn+lefSize);
TreeNode rigNode = dfs(preorder, lefPre+1+lefSize, rigPre, lefIn+1+lefSize, rigIn);
return new TreeNode(preorder[lefPre], lefNode, rigNode);
}
}
  • 分析

以前序遍历取根, 切分中序遍历的左右子树作构造

路径总和(437)

class Solution {
Map<Long, Integer> map = new HashMap<>();
int res;
public int pathSum(TreeNode root, int targetSum) {
map.put(0L,1);
dfs(root, targetSum, 0L);
return res;
} private void dfs(TreeNode node, int targetSum, long subSum){
if (node == null) return;
subSum += node.val;
if (map.containsKey(subSum - targetSum)) res +=map.get(subSum - targetSum);
map.put(subSum, map.getOrDefault(subSum, 0)+1);
dfs(node.left, targetSum, subSum);
dfs(node.right, targetSum, subSum);
map.put(subSum, map.get(subSum)-1);
}
}
  • 分析

又是一个前缀和题目

二叉树的最近公共祖先(236)

class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root == null || p == root || q == root) return root; TreeNode lefNode = lowestCommonAncestor(root.left, p, q);
TreeNode rigNode = lowestCommonAncestor(root.right, p, q); if (lefNode == null && rigNode == null) return null;
if (lefNode != null && rigNode != null) return root; return lefNode != null ? lefNode : rigNode; }
}
  • 分析

找到子节点向上return, 两节点未相遇则继续向上return

  • 感悟

二叉树题目要注意需要返回给父节点的元素

二叉树中的最大路径和(124)

class Solution {
int res = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return res;
}
private int dfs(TreeNode node){
if (node == null) return 0; int lefMax = Math.max(dfs(node.left), 0);
int rigMax = Math.max(dfs(node.right), 0); res = Math.max(res, lefMax+ node.val + rigMax);
return Math.max(lefMax, rigMax) + node.val;
}
}
  • 分析

以单向链作返回父节点元素, 取 左右链+节点 与记录的最大值作对比

hot100之二叉树下的更多相关文章

  1. leadcode的Hot100系列--二叉树创建和遍历

    很多题目涉及到二叉树,所以先把二叉树的一些基本的创建和遍历写一下,方便之后的本地代码调试. 为了方便,这里使用的数据为char类型数值,初始化数据使用一个数组. 因为这些东西比较简单,这里就不做过多详 ...

  2. [Leetcode] Binary tree level order traversal二叉树层次遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  3. 【Ural1057】幂和的数量

    [题目描述] 写一个程序来计算区间[X,Y]内满足如下条件的整数个数:它恰好等于K个互不相等的B的整数幂之和. 举个例子.令X=15,Y=20,K=2,B=2.在这个例子中,区间[15,20]内有3个 ...

  4. Java实现二叉搜索树的添加,前序、后序、中序及层序遍历,求树的节点数,求树的最大值、最小值,查找等操作

    什么也不说了,直接上代码. 首先是节点类,大家都懂得 /** * 二叉树的节点类 * * @author HeYufan * * @param <T> */ class Node<T ...

  5. MTD设备驱动

    MTD(memory technology device):内存技术设备 是linux用于描述ROM,NAND,NOR等内存设备的子系统的抽象 MTD设备可以按块读写也可以按字节读写,也就是说MTD设 ...

  6. 考试总结T2(接上次整的T1)

    首先说一句,树的每个元素的名称的问题,(那个叫jie点的东西) 具体是节点还是结点...baidu百科写的是结点... 本文章将不考虑到底这俩字怎么写...所以两种都可能出现 T2描述: 扶苏翻遍了歌 ...

  7. leetcode 198. House Robber 、 213. House Robber II 、337. House Robber III 、256. Paint House(lintcode 515) 、265. Paint House II(lintcode 516) 、276. Paint Fence(lintcode 514)

    House Robber:不能相邻,求能获得的最大值 House Robber II:不能相邻且第一个和最后一个不能同时取,求能获得的最大值 House Robber III:二叉树下的不能相邻,求能 ...

  8. STL常用序列容器

    这里简要的记述一下STL常用容器的实现原理,要点等内容. vector vector是比较常用的stl容器,用法与数组是非类似,其内部实现是连续空间分配,与数组的不同之处在于可弹性增加空间,而arra ...

  9. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  10. 剑指Offer面试题:21.从上到下打印二叉树

    一.题目:从上到下打印二叉树 题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入下图中的二叉树,则依次打印出8.6.10.5.7.9.11. 二叉树节点的定义如下,采用 ...

随机推荐

  1. 大型通用电子制造执行系统(MES)

    ​ 简介: 系统参考西门子MOM智能制造Opcenter工业软件制造执行系统Camstar电子套件人机料法环数据建模业务对象和车间生产执行事务逻辑,采用面向对象分层设计与C#编程开发:包含电子制造企业 ...

  2. 接口新特性--java进阶day03

    1.接口新特性 在JDk8和JDK9开始,接口可以定义普通方法 这时就会感到很奇怪,明明之前说好接口只是用来制定规则的,为什么现在又可以定义普通方法了呢? 我们以一个公司案例进行讲解,公司1.0上线了 ...

  3. Microsoft.NETCore.App 版本不一致导致的运行失败

    场景重现 今天新建了一个 ASP.NET Core 的项目, 通过 Web Deploy 顺利发布到IIS上后, 但访问时出现如下异常: 异常原因 通过手动执行dotnet命令发现运行框架版本不一致? ...

  4. Python合成多个视频为一个脚本

    编写背景: 由于线上用户反馈媒体添加页加载时间很长,猜测是由于本地视频内存过大引起,于是编写此脚本以便快速生成内存很大的视频 代码如下: # coding=utf-8 from moviepy.edi ...

  5. dify MCP工具调用

    一.概述 前面几篇文章,介绍了Cherry Studio客户端调用MCP,接下来介绍dify如何调用MCP 二.dify插件 需要安装2个插件,分别是:Agent 策略(支持 MCP 工具),MCP ...

  6. 使用TypeScript开发微信小程序(云开发)-入门篇

    配置小程序云开发 TypeScript 环境 1. 检查本地 nodejs 环境 2. 安装 TypeScript npm install typescript --save-dev 3. 初始化/配 ...

  7. 还有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案

    与上一篇区别在于,详情里面的模板通常是通用的,被定义在样式文件中,被重复使用,因此无法为其添加后台代码,如果能添加后台代码,请翻阅第一篇:所以需要用到命令的方式来辅助事件的抛出,当然还可以利用第三方库 ...

  8. 基于Python和uiautomation的Windows桌面自动化操作方案

    基于Python和uiautomation的Windows桌面自动化操作方案 在日常开发和测试过程中,我们经常需要对Windows桌面应用程序进行自动化操作.本文将记录如何使用uiautomation ...

  9. JAVA安全之JDK8u141版本绕过研究

    基本介绍 从JDK8u141开始JEP290中针对RegistryImpl_Skel#dispatch中bind.unbind.rebind操作增加了checkAccess检查,此项检查只允许来源为本 ...

  10. 【工具】JS脚本|网页任意视频倍速播放(包括MOOC、本地视频、其他的视频)

    实际发布时间:2022-12-14 22:54:52. csdn禁止浏览器脚本相关博客了,就只能重新发到这儿了. 2024/12/14更新:更新了常见问题Q&A,可以配合食用.   只要浏览器 ...