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. 我们用一根树枝两端连接的 ...
随机推荐
- 查看docker服务状态
root用户使用 #查看docker服务状态: systemctl status docker 非root用户使用 #查看docker服务: sudo systemctl status docker
- Destination host unreachable 一般解决办法
症状: 上网各类应用基本正常,但是在命令行下使用ping命令,无论任何地址,均反馈Destination host unreachable. 分析: 输入命令arp -a可以看到网关的MAC地址正常解 ...
- 使用 vscode-jest 插件
vscode-jest [error] Abort jest session: Not able to auto detect a valid jest command: multiple candi ...
- 离线版nrfutil工具安装方法
简介 nrfutil是Nordic提供的命令行工具集.支持以下功能: 基于Jlink的固件烧录.读取.flash擦除.recover 基于MCUBOOT的固件升级(DFU) 基于nRF5 bootlo ...
- android中大咖:TlistView
d的android中的Tlistview相当于cxGrid,其开发使用中的主咖地位至高无上. 可是如何高效使用快速实现的需求呢?需要的话补官方的教程 上图: GOODLUCK!
- STLINK/JLINK USB识别不稳定问题的解决
第一阶段:自己基于STM32F103C8T6的STLINK,调试一直正常. 第二阶段:发现了硬汉的教程,基于JLINK的RTT viewer 代替串口打印调试信息,所以购买了JLINK,手里的STLI ...
- 修显示器led屏幕能亮但是显示异常
用电吹风热风大风 对着显示器的 ' led 区域 ' 吹十分钟 吹显示器线插口 电源线 插口 机箱 断电吹 // 温度挺高 还得吹显卡接口 线也要换新的 插口需要用线的接口 打磨金属 ...
- Java+Selenium+Junit实现web自动化demo
1.新建maven工程 打开IDEA新建maven项目并引入相关依赖,步骤如下: 需要引入的依赖 <dependencies> <dependency> <groupId ...
- pytorch 实战教程之 Feature Pyramid Networks (FPN) 特征金字塔网络实现代码
原文作者:aircraft 原文链接:pytorch 实战教程之 Feature Pyramid Networks (FPN) 特征金字塔网络实现代码 - aircraft - 博客园 学习YOLOv ...
- Electron35-DeepSeek桌面端AI系统|vue3.5+electron+arco客户端ai模板
2025跨平台ai实战electron35+vite6+arco仿DeepSeek/豆包ai流式打字聊天助手. electron-deepseek-chat:实战ai大模型对话,基于vue3.5+el ...