【一天一大 lee】二叉搜索树的最小绝对差 (难度:简单) - Day20201012
时间:2022-07-26
本文章向大家介绍【一天一大 lee】二叉搜索树的最小绝对差 (难度:简单) - Day20201012,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
20201012
题目:
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
输入:
1
3
/
2
输出:
1
解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
提示:
- 树中至少有 2 个节点。
抛砖引玉
思路
二叉搜索树(二叉查找树,二叉排序树):
- 空
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
中序遍历二叉搜索树(得到的元素为递增的)
抛砖引玉
深度优先遍历(DFS)
DFS 中序遍历模板:
function dfs(node) {
if (node == null) return
if (node.left) dfs(node.left)
if (node.right) dfs(node.right)
}
记录节点值递增,记录上一个节点,分别与后续节点值求差值,返回遇到的最小数
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var minDiffInBST = function(root) {
let _result = Number.MAX_VALUE,
preNode = null
function dfs(node) {
if (node === null) return
if (node.left) dfs(node.left)
if (preNode && preNode.val !== null) {
_result = Math.min(_result, node.val - preNode.val)
}
preNode = node
if (node.right) dfs(node.right)
}
dfs(root)
return _result
}
广度优先搜索(BFS)
BFS 模板:
function(root) {
if (root == null) return
let queue = [root]
while(queue.length){
let node = queue.pop();
if(node.left) queue.push(node.left)
if(node.right) queue.push(node.right)
}
}
按照上面 BFS 模板遍历为非中序遍历,但是逻辑上即使不是中序遍历,只要完成遍历,我们可以重新对遍历的值排序然后再求值
var minDiffInBST = function(root) {
let _result = Number.MAX_VALUE,
list = [],
queue = [root]
while (queue.length) {
let node = queue.pop()
list.push(node.val)
if (node.left) queue.push(node.left)
if (node.right) queue.push(node.right)
}
list.sort((a, b) => a - b)
for (let i = 1; i < list.length; i++) {
_result = Math.min(_result, list[i] - list[i - 1])
}
return _result
}
BFS 中序遍历
var minDiffInBST = function(root) {
let _result = Number.MAX_VALUE,
preNode = null,
queue = []
while (queue.length > 0 || root) {
while (root) {
queue.push(root)
root = root.left
}
root = queue.pop()
if (preNode && preNode.val !== null) {
_result = Math.min(_result, root.val - preNode.val)
}
preNode = root
root = root.right
}
return _result
}
- 揭秘前端字符的戏精之路
- 跨语言嵌入模型的调查
- React Native如何消除启动时白屏
- 如何在Python中将TimeDistributed层用于Long Short-Term Memory Networks
- react native 调用原生UI组件
- Android侧滑删除另一种实现,SwipeListView补充
- React Native调用原生组件
- React Native调用原生UI组件
- js不好学并不是因为它难,而是因为它容易混淆
- Gradle详解
- React Native网络请求fetch简单封装
- Promise机制
- React Native 自定义控件之验证码和Toast
- React 高阶组件HOC
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java编程思想第四版第十三章字符串 总结
- LoRa节点开发——代码详解修改LoRaWAN相关参数
- 01 . Redis简介及部署主从复制
- 07 . Kubernetes之Service
- LoRa节点开发——代码详解如何修改发射和接收信道(频率)
- 06 . Kubernetes之Pod控制器详细介绍及应用
- Python面试题
- 08 . Kubernetes之 ingress及Ingress Controller
- cpu占用过高排查
- LoRa节点开发——代码详解LoRaWAN发送与接收数据
- java编程思想第四版第十四章 类型信息习题
- 聊一聊,如何解密、分析LoRaWAN数据包?
- java编程思想第四版第十四章 类型信息总结
- 10 . Python之面向对象
- 11 . Python3之异常,调试和测试