[数据结构与算法]js实现二叉树
DFS 与 BFS
dfs 递归 本质通过栈结构
bfs 层序遍历 通过队列结构
function permute(nums) {let res = [];let cur = []; // 记录当前内容let visted = {}; //记录访问过的节点let len = nums.length;function dfs(nth) {//递归终止条件if (nth === len) {res.push([...cur]);return ;}//检查还有哪些数字可以使用for (let i = 0; i < len; i++) {if (!visted[i]) {//记录访问过的节点visted[i] = true;cur.push(nums[i]);//递归dfs(nth + 1);//回溯cur.pop();visted[i] = false;}}}dfs(0);return res;}
//广度优先搜索function bfs(root) {let queue = [];//观察的当前节点入队queue.push(root);//当队列还有元素说明还没有遍历完while (queue.length) {//头节点出队let cur = queue.shift();//访问头节点console.log(cur.val);if (cur.left) queue.push(cur.left);if (cur.right) queue.push(cur.right);}
全排列
46. 全排列 - 力扣(LeetCode)
组合问题
78. 子集 - 力扣(LeetCode)
77. 组合 - 力扣(LeetCode)
二叉树遍历
先序遍历的迭代
var preorderTraversal = function(root) {let stk=[]let res=[]stk.push(root)while(stk.length!=0){let node = stk.pop()if(node) res.push(node.val)if(node && node.right) stk.push(node.right)if(node && node.left) stk.push(node.left)}return res};
后序遍历 的迭代
var postorderTraversal = function(root) {//左 右 中let res = []let stk=[]stk.push(root)while(stk.length){let node = stk.pop()if(node) res.push(node.val)if(node && node.left) stk.push(node.left)if(node && node.right) stk.push(node.right)}res.reverse()return res};
中序遍历的迭代
var inorderTraversal = function(root) {//左中右let stk =[]let res =[]let cur=rootwhile(stk.length || cur){while(cur){stk.push(cur)cur=cur.left}cur = stk.pop()res.push(cur.val)cur=cur.right}return res;};
层序遍历
var levelOrder = function(root) {let queue=[] // 每一层的值let res=[]if(!root) return resqueue.push(root)while(queue.length){let cur=[] //记录当前层的节点let len = queue.lengthwhile(len!=0){len--;let node = queue.shift()if(node) cur.push(node.val)if(node && node.left) queue.push(node.left)if(node && node.right) queue.push(node.right)}res.push(cur)}return res;};
二叉树翻转
var invertTree = function(root) {function dfs(root){if(!root) return null;let left =dfs(root.left)let right = dfs(root.right)root.left = rightroot.right = leftreturn root}dfs(root)return root};
二叉搜索树 BST
搜索,插入
function dfs(root,val){//节点为空,找到目标if(!root){return new TreeNode(val)}if(val > root.val){root.right = dfs(root.right,val)}else{root.left = dfs(root.left,val)}return root}
删除
var deleteNode = function(root, key) {function leftMax(root) {while (root.right) {root = root.right;}return root;}function rightMin(root) {while (root.left) {root = root.left;}return root;}function dfs(root, key) {if (!root) return null;// 找到了,进行删除操作if (root.val === key) {// 删除的是叶子节点,直接删除if (!root.left &&!root.right) {return null;} else if (root.left) {// 存在左子树--找到左子树中的最大值let node = leftMax(root.left);root.val = node.val;// 删除 noderoot.left = dfs(root.left, node.val);} else {// 存在右子树 -- 找到右子树的最小值let node = rightMin(root.right);root.val = node.val;// 删除 noderoot.right = dfs(root.right, node.val);}} else if (root.val > key) {root.left = dfs(root.left, key);} else {root.right = dfs(root.right, key);}return root;}return dfs(root, key);};
108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
98. 验证二叉搜索树 - 力扣(LeetCode)
平衡二叉树 AVL
特殊的二叉搜索树
任意节点的左右子树绝对值不超过1
判定
var isBalanced = function(root) {let res = true;function dfs(root){if(!root) return 0;let left = dfs(root.left)let right = dfs(root.right)if(Math.abs(left-right)>1){res = false}let height = left > right ? left :rightreturn height+1;}dfs(root)return res;};
构造
1382. 将二叉搜索树变平衡 - 力扣(LeetCode)
特殊二叉树-堆结构
完全二叉树
每一层的节点数,都到达了当前层所能到达的最大值
从左到右,不存在跳序排列
索引规律
对索引为n
的节点,
- 父节点:(n-1)/2
- 左孩子:2*n+1
- 右孩子:2*n+2
堆是特殊的完全二叉树,分为大顶堆,小顶堆
删除—取出堆顶元素
以大顶堆为例,
不断向下对比交换
的过程
// 入参是堆元素在数组里的索引范围,low表示下界,high表示上界
function downHeap(low, high) {// 初始化 i 为当前结点,j 为当前结点的左孩子let i=low,j=i*2+1 // 当 j 不超过上界时,重复向下对比+交换的操作while(j <= high) {// 如果右孩子比左孩子更大,则用右孩子和根结点比较if(j+1 <= high && heap[j+1] > heap[j]) {j = j+1}// 若当前结点比孩子结点小,则交换两者的位置,把较大的结点“拱上去”if(heap[i] < heap[j]) {// 交换位置const temp = heap[j] heap[j] = heap[i] heap[i] = temp// i 更新为被交换的孩子结点的索引i=j // j 更新为孩子结点的左孩子的索引j=j*2+1} else {break}}
}
插入—往堆里面追加元素
首先放入堆的最后一个位置
不断向上比较交换
的过程
// 入参是堆元素在数组里的索引范围,low表示下界,high表示上界
function upHeap(low, high) {// 初始化 i(当前结点索引)为上界let i = high // 初始化 j 为 i 的父结点let j = Math.floor((i-1)/2) // 当 j 不逾越下界时,重复向上对比+交换的过程while(j>=low) {// 若当前结点比父结点大if(heap[j]<heap[i]) {// 交换当前结点与父结点,保持父结点是较大的一个const temp = heap[j] heap[j] = heap[i] heap[i] = temp// i更新为被交换父结点的位置i=j // j更新为父结点的父结点j=Math.floor((i-1)/2) } else {break}}
}
优先队列
LCR 076. 数组中的第 K 个最大元素 - 力扣(LeetCode)
相关文章:

[数据结构与算法]js实现二叉树
DFS 与 BFS dfs 递归 本质通过栈结构 bfs 层序遍历 通过队列结构 function permute(nums) {let res [];let cur []; // 记录当前内容let visted {}; //记录访问过的节点let len nums.length;function dfs(nth) {//递归终止条件if (nth len) {res.push([...cur]);return …...
MySQL程序之:连接到服务器的命令选项
本节介绍大多数MySQL客户端程序支持的选项,这些选项控制客户端程序如何建立与服务器的连接、连接是否加密以及连接是否压缩。这些选项可以在命令行或选项文件中给出。 连接建立的命令选项 本节介绍控制客户端程序如何建立与服务器的连接的选项。 表6.4连接建立选…...

python3GUI--仿崩坏三二次元登录页面(附下载地址) By:PyQt5
文章目录 一.前言二.预览三.实现方案1.实现原理1.PyQt52. 具体实现 2.UI设计1.UI组件化、模块化2.UI设计风格思路 3.项目代码结构4.使用方法3.代码分享1.支持跳转网页的QLabel组件2.三角形ICON按钮 四.总结 大小:33.3 …...

阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化
在直播场景中,阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力,确保直播间高并发时的流畅体验,降低了我们的运营成本,简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力,实现了数…...
Unity 学习指南与资料分享
Unity学习资料 Unity学习资料 Unity学习资料 Unity 作为一款强大的跨平台游戏开发引擎,在游戏开发及实时 3D 内容创作领域占据着重要地位。它功能丰富、易于上手,支持多平台发布,为开发者提供了广阔的创作空间。下面为你带来全面的 Unity 学…...
Android SystemUI——CarSystemBar视图解析(十一)
前面文章我们已经把 CarSystemBar 从启动到构建视图,再到将视图添加到 Window 的流程分析完毕,我们知道默认情况下在车载系统中只显示顶部栏和底部栏视图的。这里我们在前面文章的基础上以顶部栏为例具体解析其视图的结构。 一、顶部栏解析 通过《CarSystemBar车载状态栏》这…...

.NET周刊【1月第1期 2025-01-05】
国内文章 3款.NET开源、功能强大的通讯调试工具,效率提升利器! https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具,旨在提高调试效率。这些工具包括LLCOM,提供串口调试和自动化处…...

初识go语言之指针用法
一、环境准备 安装go语言编译环境,官网地址:https://go.dev/dl/ 或者 https://golang.google.cn/dl/ 点击下载按提示安装即可 vscode 安装go语言扩展 测试 package mainimport "fmt"func main() {fmt.Println("Hello, World!") …...

用户中心项目教程(二)---umi3的使用出现的错误
目录 1.情况的说明 2.遇到的问题 1)第一个问题-关于npx的使用 2)第二个问题--unsupport问题 3)第三个收获--nodejs安装问题 4)第四个收获---nvm下载问题 5)第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…...
Android设备:Linux远程gdb调试
更多内容:XiaoJ的知识星球 目录 1.准备工作1)安装Android NDK:2)连接Android手机3)编译程序 2.启动gdbserver1)**推送gdbserver及可执行文件**:**2)启动gdbserver**:3&am…...

(十四)WebGL纹理坐标初识
纹理坐标是 WebGL 中将 2D 图像(纹理)应用到 3D 物体表面的重要概念。在 WebGL 中,纹理坐标通常使用一个二维坐标系,称为 uv 坐标,它们决定了纹理图像如何映射到几何体上。理解纹理坐标的核心就是明白它们如何将二维纹…...

【机器学习】制造业转型:机器学习如何推动工业 4.0 的深度发展
我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 引言 在当今科技飞速发展的时代,制造业正经历着前所未有的变革,工业4.0的浪潮席卷而来。工业4.0旨在通过将…...

Nginx安装配置Mac使用Nginx访问前端打包项目
目录 Linux安装环境变量配置 WinMac安装基本配置 Mac使用Nginx访问前端项目常用命令 Linux 官网:https://nginx.org/ 中文官网:https://nginx.p2hp.com/ 安装 http://nginx.org/en/download.html 1). 安装依赖包 由于nginx是基于c语言开发的&#x…...

国自然面上项目|基于组合机器学习算法的病理性近视眼底多模态影像资料自动化定量分析研究|基金申请·25-01-18
小罗碎碎念 今天和大家分享一个面上项目,资助年限为2020~2023,直接费用为55万。 病理性近视致盲问题严峻,机制和诊疗策略尚待探索。本项目基于前期积累的大量影像资料和算法开发工作,计划构建标准影像数据库࿰…...

03_UI自适应
因为Canvas大小是始终和屏幕一致的 所以设置Canvas的屏幕大小 通常设置为1920 * 1080 又因为屏幕的图像及按钮如果想适配各种显示屏需要锁定长或者宽, 之后利用钉子将其他图像利用创建空节点定在左右或者上下两侧 比如unity编辑器通常是锁定宽的,那我…...
Python在DevOps中的应用:自动化CI/CD管道的实现
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在现代软件开发中,DevOps理念的引入极大地提升了开发与运维的协作效率,而持续集成(…...
API接口技术推动电商数据处理的自动化
在当今数字化浪潮中,电商行业正以前所未有的速度发展。API(Application Programming Interface,应用程序编程接口)接口技术在这一过程中扮演着至关重要的角色。API接口作为连接不同系统和服务的关键桥梁,通过其自动化处…...
Nginx反向代理架构介绍
Nginx反向代理架构是一种强大的服务器架构模式,它位于用户和原始服务器之间,接收用户的请求并将其转发到一个或多个后端服务器,然后将从后端服务器获取的响应返回给用户,就好像这些内容都是由代理服务器本身直接提供的一样。以下是…...

.Net Core微服务入门系列(一)——项目搭建
系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...
WPF 实现可视化操作数据库的程序全解析
在软件开发中,实现对数据库的可视化操作能极大提升开发效率和用户体验。借助 WPF(Windows Presentation Foundation)强大的界面开发能力,我们可以打造出功能丰富、交互友好的数据库操作程序。本文将详细介绍如何使用 WPF 搭建一个…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...