当前位置: 首页 > news >正文

[数据结构与算法]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的节点,

  1. 父节点:(n-1)/2
  2. 左孩子:2*n+1
  3. 右孩子: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客户端程序支持的选项&#xff0c;这些选项控制客户端程序如何建立与服务器的连接、连接是否加密以及连接是否压缩。这些选项可以在命令行或选项文件中给出。 连接建立的命令选项 本节介绍控制客户端程序如何建立与服务器的连接的选项。 表6.4连接建立选…...

python3GUI--仿崩坏三二次元登录页面(附下载地址) By:PyQt5

文章目录 一&#xff0e;前言二&#xff0e;预览三&#xff0e;实现方案1.实现原理1.PyQt52. 具体实现 2.UI设计1.UI组件化、模块化2.UI设计风格思路 3.项目代码结构4.使用方法3.代码分享1.支持跳转网页的QLabel组件2.三角形ICON按钮 四&#xff0e;总结 大小&#xff1a;33.3 …...

阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化

在直播场景中&#xff0c;阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力&#xff0c;确保直播间高并发时的流畅体验&#xff0c;降低了我们的运营成本&#xff0c;简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力&#xff0c;实现了数…...

Unity 学习指南与资料分享

Unity学习资料 Unity学习资料 Unity学习资料 Unity 作为一款强大的跨平台游戏开发引擎&#xff0c;在游戏开发及实时 3D 内容创作领域占据着重要地位。它功能丰富、易于上手&#xff0c;支持多平台发布&#xff0c;为开发者提供了广阔的创作空间。下面为你带来全面的 Unity 学…...

Android SystemUI——CarSystemBar视图解析(十一)

前面文章我们已经把 CarSystemBar 从启动到构建视图,再到将视图添加到 Window 的流程分析完毕,我们知道默认情况下在车载系统中只显示顶部栏和底部栏视图的。这里我们在前面文章的基础上以顶部栏为例具体解析其视图的结构。 一、顶部栏解析 通过《CarSystemBar车载状态栏》这…...

.NET周刊【1月第1期 2025-01-05】

国内文章 3款.NET开源、功能强大的通讯调试工具&#xff0c;效率提升利器&#xff01; https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具&#xff0c;旨在提高调试效率。这些工具包括LLCOM&#xff0c;提供串口调试和自动化处…...

初识go语言之指针用法

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

用户中心项目教程(二)---umi3的使用出现的错误

目录 1.情况的说明 2.遇到的问题 1&#xff09;第一个问题-关于npx的使用 2&#xff09;第二个问题--unsupport问题 3&#xff09;第三个收获--nodejs安装问题 4&#xff09;第四个收获---nvm下载问题 5&#xff09;第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…...

Android设备:Linux远程gdb调试

更多内容&#xff1a;XiaoJ的知识星球 目录 1.准备工作1&#xff09;安装Android NDK&#xff1a;2&#xff09;连接Android手机3&#xff09;编译程序 2.启动gdbserver1&#xff09;**推送gdbserver及可执行文件**&#xff1a;**2&#xff09;启动gdbserver**&#xff1a;3&am…...

(十四)WebGL纹理坐标初识

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

【机器学习】制造业转型:机器学习如何推动工业 4.0 的深度发展

我的个人主页 我的领域&#xff1a;人工智能篇&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;&#x1f44d;点赞 收藏❤ 引言 在当今科技飞速发展的时代&#xff0c;制造业正经历着前所未有的变革&#xff0c;工业4.0的浪潮席卷而来。工业4.0旨在通过将…...

Nginx安装配置Mac使用Nginx访问前端打包项目

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

国自然面上项目|基于组合机器学习算法的病理性近视眼底多模态影像资料自动化定量分析研究|基金申请·25-01-18

小罗碎碎念 今天和大家分享一个面上项目&#xff0c;资助年限为2020&#xff5e;2023&#xff0c;直接费用为55万。 病理性近视致盲问题严峻&#xff0c;机制和诊疗策略尚待探索。本项目基于前期积累的大量影像资料和算法开发工作&#xff0c;计划构建标准影像数据库&#xff0…...

03_UI自适应

因为Canvas大小是始终和屏幕一致的 所以设置Canvas的屏幕大小 通常设置为1920 * 1080 又因为屏幕的图像及按钮如果想适配各种显示屏需要锁定长或者宽&#xff0c; 之后利用钉子将其他图像利用创建空节点定在左右或者上下两侧 比如unity编辑器通常是锁定宽的&#xff0c;那我…...

Python在DevOps中的应用:自动化CI/CD管道的实现

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 在现代软件开发中&#xff0c;DevOps理念的引入极大地提升了开发与运维的协作效率&#xff0c;而持续集成&#xff08…...

API接口技术推动电商数据处理的自动化

在当今数字化浪潮中&#xff0c;电商行业正以前所未有的速度发展。API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;接口技术在这一过程中扮演着至关重要的角色。API接口作为连接不同系统和服务的关键桥梁&#xff0c;通过其自动化处…...

Nginx反向代理架构介绍

Nginx反向代理架构是一种强大的服务器架构模式&#xff0c;它位于用户和原始服务器之间&#xff0c;接收用户的请求并将其转发到一个或多个后端服务器&#xff0c;然后将从后端服务器获取的响应返回给用户&#xff0c;就好像这些内容都是由代理服务器本身直接提供的一样。以下是…...

.Net Core微服务入门系列(一)——项目搭建

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…...

WPF 实现可视化操作数据库的程序全解析

在软件开发中&#xff0c;实现对数据库的可视化操作能极大提升开发效率和用户体验。借助 WPF&#xff08;Windows Presentation Foundation&#xff09;强大的界面开发能力&#xff0c;我们可以打造出功能丰富、交互友好的数据库操作程序。本文将详细介绍如何使用 WPF 搭建一个…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...