0

0

JS数据结构实现_链表与二叉树

夢幻星辰

夢幻星辰

发布时间:2025-11-16 16:44:56

|

438人浏览过

|

来源于php中文网

原创

链表和二叉搜索树可用JavaScript通过对象引用实现。1. 单向链表支持尾插、指定位置插入和删除节点,操作高效;2. 二叉搜索树实现插入、查找、中序遍历及最值获取,平均时间复杂度O(log n)。两者均适用于动态数据管理,是前端算法基础。

js数据结构实现_链表与二叉树

链表和二叉树是前端开发中常被忽视但非常重要的基础数据结构。虽然JavaScript不像C或Java那样直接支持指针和类,但我们可以通过对象引用来模拟这些结构。下面介绍如何用JS实现单向链表和二叉搜索树(BST),并附上常用操作。

单向链表的实现

链表由一系列节点组成,每个节点包含数据和指向下一个节点的引用。相比数组,链表在插入和删除操作上更高效。

定义节点和链表结构:

class ListNode {
  constructor(val) {
    this.val = val;
    this.next = null;
  }
}

class LinkedList { constructor() { this.head = null; this.size = 0; }

// 在尾部添加节点 append(val) { const node = new ListNode(val); if (!this.head) { this.head = node; } else { let current = this.head; while (current.next) { current = current.next; } current.next = node; } this.size++; }

// 在指定位置插入 insertAt(index, val) { if (index < 0 || index > this.size) return false; const node = new ListNode(val); if (index === 0) { node.next = this.head; this.head = node; } else { let current = this.head; for (let i = 0; i < index - 1; i++) { current = current.next; } node.next = current.next; current.next = node; } this.size++; return true; }

// 删除指定值的第一个节点 remove(val) { if (!this.head) return null; if (this.head.val === val) { const removed = this.head; this.head = this.head.next; this.size--; return removed.val; } let current = this.head; while (current.next && current.next.val !== val) { current = current.next; } if (current.next) { const removed = current.next; current.next = current.next.next; this.size--; return removed.val; } return null; }

// 打印链表 print() { const result = []; let current = this.head; while (current) { result.push(current.val); current = current.next; } console.log(result.join(' -> ')); } }

使用示例:

const list = new LinkedList();
list.append(1);
list.append(2);
list.append(3);
list.insertAt(1, 1.5);
list.print(); // 输出: 1 -> 1.5 -> 2 -> 3
list.remove(1.5);
list.print(); // 输出: 1 -> 2 -> 3

二叉搜索树(BST)的实现

二叉树每个节点最多有两个子节点:左子树和右子树。二叉搜索树在此基础上满足:左子节点值小于父节点,右子节点值大于父节点。

GitHub Copilot
GitHub Copilot

GitHub AI编程工具,实时编程建议

下载

定义节点和树结构:

class TreeNode {
  constructor(val) {
    this.val = val;
    this.left = null;
    this.right = null;
  }
}

class BinarySearchTree { constructor() { this.root = null; }

// 插入节点 insert(val) { const node = new TreeNode(val); if (!this.root) { this.root = node; } else { this._insertNode(this.root, node); } }

_insertNode(root, node) { if (node.val < root.val) { if (!root.left) { root.left = node; } else { this._insertNode(root.left, node); } } else { if (!root.right) { root.right = node; } else { this._insertNode(root.right, node); } } }

// 查找节点 search(val) { return this._searchNode(this.root, val); }

_searchNode(root, val) { if (!root) return false; if (val === root.val) return true; return val < root.val ? this._searchNode(root.left, val) : this._searchNode(root.right, val); }

// 中序遍历(升序输出) inOrder(callback) { this._inOrderNode(this.root, callback); }

_inOrderNode(node, callback) { if (node) { this._inOrderNode(node.left, callback); callback(node.val); this._inOrderNode(node.right, callback); } }

// 最小值 min() { let node = this.root; while (node && node.left) { node = node.left; } return node ? node.val : null; }

// 最大值 max() { let node = this.root; while (node && node.right) { node = node.right; } return node ? node.val : null; } }

使用示例:

const bst = new BinarySearchTree();
bst.insert(10);
bst.insert(5);
bst.insert(15);
bst.insert(3);
bst.insert(7);

console.log(bst.search(7)); // true console.log(bst.search(12)); // false

bst.inOrder((val) => console.log(val)); // 输出: 3, 5, 7, 10, 15 console.log(bst.min()); // 3 console.log(bst.max()); // 15

链表适合频繁增删的场景,而二叉搜索树在查找、插入、删除上平均时间复杂度为O(log n),特别适合动态数据集合管理。理解这些结构有助于写出更高效的算法,比如LeetCode中的很多题目都依赖这些基础。

基本上就这些,不复杂但容易忽略细节。掌握后可以尝试扩展双向链表、平衡二叉树等进阶内容。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

831

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

737

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

733

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

396

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16925

2023.08.03

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

80

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7万人学习

Django 教程
Django 教程

共28课时 | 3万人学习

MongoDB 教程
MongoDB 教程

共17课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号