hot100之二叉树上
二叉树的中序队列(094)
先看代码
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (!stack.isEmpty() || root != null){
if (root != null){
stack.add(root);
root = root.left;
}else {
TreeNode node = stack.pop();
res.add(node.val);
root = node.right;
}
}
return res;
}
}
- 分析
通过stack保存二叉树遍历栈, 反序遍历栈节点
二叉树的最大深度(104)
先看代码
class Solution {
int res = 0;
public int maxDepth(TreeNode root) {
if (root == null) return 0;
int lefDepth = maxDepth(root.left);
int rigDepth = maxDepth(root.right);
return Math.max(lefDepth, rigDepth) + 1;
}
}
- 分析
递归调用自身
- 感悟
递归看的真的非常清爽, 写的也很清爽
翻转二叉树(226)
省略
对称二叉树(101)
省略
二叉树直径(543)
先看代码
class Solution {
int res = 0;
public int diameterOfBinaryTree(TreeNode root) {
maxDepthBinaryTree(root);
return res;
}
private int maxDepthBinaryTree(TreeNode node){
if (node == null) return 0;
int lefMax = maxDepthBinaryTree(node.left);
int rigMax = maxDepthBinaryTree(node.right);
res = Math.max(lefMax + rigMax, res);
return Math.max(lefMax, rigMax) + 1;
}
}
- 分析
增加了一个全局res
参数用于记录最大长度, 可能算是贪心
- 感悟
递归要维持一致的变量与传递参数, 单凭借自身的传递参数无法解决问题, 所以引入了res
全局变量
二叉树的层序遍历(102)
先看代码
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Deque<TreeNode> queue = new ArrayDeque<>();
if (root != null) queue.addFirst(root);
while (!queue.isEmpty()){
int n = queue.size();
List<Integer> layer = new ArrayList<>(n);
for (int i = 0; i < n; i++){
TreeNode node = queue.removeLast();
layer.add(node.val);
if (node.left != null) queue.addFirst(node.left);
if (node.right != null) queue.addFirst(node.right);
}
res.add(layer);
}
return res;
}
}
- 分析
通过双端队列, 左端入新端点, 右端出老端点, 每次for
循环, 一次性遍历完老端点
将有序数组转换为二叉搜索树(108)
略
验证二叉搜索树(098)
先看代码
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, null, null);
}
private boolean isValidBST(TreeNode node, Integer max, Integer min){
if (node == null) return true;
int val = node.val;
if (max != null && val >= max) return false;
if (min != null && val <= min) return false;
return isValidBST(node.left, val, min) && isValidBST(node.right, max, val);
}
}
- 分析
通过函数传参 max, min
二叉树搜索树中第K小的元素(230)
先看代码
class Solution {
int k;
public int kthSmallest(TreeNode root, int k) {
this.k = k;
return dfs(root);
}
private int dfs(TreeNode node){
if (node == null) return -1;
int lefNode = dfs(node.left);
if (lefNode != -1) return lefNode;
if (--k == 0) return node.val;
return dfs(node.right);
}
}
- 分析
左根右的遍历方法
一开始使用void dfs()
然后用 全局的res
来存储最终结果
但发现void dfs()
的情况下, 递归不会因为得到res
后停止递归
而后选择 int dfs()
直接return node.val
避免后续没必要递归
hot100之二叉树上的更多相关文章
- 算法进阶面试题04——平衡二叉搜索树、AVL/红黑/SB树、删除和调整平衡的方法、输出大楼轮廓、累加和等于num的最长数组、滴滴Xor
接着第三课的内容和讲了第四课的部分内容 1.介绍二叉搜索树 在二叉树上,何为一个节点的后继节点? 何为搜索二叉树? 如何实现搜索二叉树的查找?插入?删除? 二叉树的概念上衍生出的. 任何一个节点,左比 ...
- 洛谷 P2015 二叉苹果树 (树上背包)
洛谷 P2015 二叉苹果树 (树上背包) 一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包. 首先,定义状态\(d ...
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
03-树1. List Leaves (25) Given a tree, you are supposed to list all the leaves in the order of top do ...
- &12-2 查找二叉搜索树
#1,定理 在一棵高度为h的二叉搜索树上,动态集合上的操作SEARCH.MINIMUM.MAXIMUM.SUCCESSOR和PREDECESSOR可以在O(h)时间内完成. #2,伪代码 分别是搜索, ...
- 二叉搜索树 C++代码实现
暂未发现什么bug,如果发现请指出. #include<iostream> using namespace std; //定义二叉搜索树的结点 struct Node { int data ...
- 高度平衡的二叉搜索树(AVL树)
AVL树的基本概念 AVL树是一种高度平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1. 有人也许要问:为什么要有AVL树呢?它有什么 ...
- 二叉搜索树的平衡--AVL树和树的旋转(图解)
二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...
- 二叉搜索树(BST)学习笔记
BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...
- 二叉搜索树的平衡--AVL树和树的旋转
二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...
- 二叉苹果树|codevs5565|luoguP2015|树形DP|Elena
二叉苹果树 题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的 ...
随机推荐
- dotnet 源代码生成器分析器入门
本文将带领大家入门 dotnet 的 SourceGenerator 源代码生成器技术,期待大家阅读完本文能够看懂理解和编写源代码生成器和分析器 恭喜你看到了本文,进入到 C# dotnet 的深水区 ...
- games101 作业4提高部分
games101 作业4提高部分 作业四中,我们按照实验步骤完成bazier曲线之后,得到的结果有一定的锯齿感: 然后pdf中给出的思路是: 对于一个曲线上的点,不只把它对应于一个像素,你需要根据到像 ...
- BUUCTF---Morse
1.题目 -..../.----/-..../-..../-..../...--/--.../....-/-..../-..../--.../-.../...--/.----/--.../...--/ ...
- 【Java】枚举类和注解
一.枚举类的使用 1. 枚举类的说明: 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类 当需要定义一组常量时,强烈建议使用枚举类 枚举类的实现: JDK 5.0以前需要自定义 JDK 5 ...
- Quartz.NET - 教程 1: 使用 Quartz
译者注: 目录在这 Quartz.NET 3.x 教程 原文在这 Lesson 1: Using Quartz 在你使用调度器之前, 你需要先实例化(能猜到是谁么?). 要实例化, 请使用 ISche ...
- 学习unigui【23】uniDBGrid的使用摘要
Unidbgrid自动调整列宽 UniDBGrid1 -> ClientEvents -> ExtEvents [Ext.data.Store[store] ] add store.loa ...
- C# 调用 Win10/11 文件关联对话框
方法一:调用未公开接口 IOpenWithLauncher Adobe Acrobat 应该是调用的未公开接口方法 [ComImport] [InterfaceType(ComInterfaceTyp ...
- [T.2] 团队项目:选题和需求分析
项目 内容 这个作业属于哪个课程 2025年春季软件工程(罗杰.任健) 这个作业的要求在哪里 T.2团队项目:选题和需求分析 团队在这个课程的目标是 学习软件工程相关知识,培养编程和团队协作能力,做出 ...
- 强化学习(on-policy)同步并行采样(on-line)的并行化效率分析
在强化学习中(on-line)的算法如果是on-policy的算法都是需要较大的采样样本的,因此采样的效率往往对整个算法运行效率有着自关重要的影响,在deepmind(Google)公司的强化学习的并 ...
- 测试工作中用到的Redis命令
由于项目测试的需要,经常需要连接Redis数据库修改某些键值,无奈最近Redis的客户端连接工具使用不了 只有使用命令行来操作了,现总结如下: 1.远程连接Redis redis-cli -h hos ...