新闻中心

J*aScript数据结构_链表与树实现

2025-11-24
浏览次数:
返回列表
单向链表和二叉搜索树可通过对象与引用实现;链表由含值和下一节点指针的节点组成,支持增删查遍操作;树结构中左子小于父、右子大于父,实现插入、查找与遍历。

javascript数据结构_链表与树实现

链表和树是J*aScript中常用的数据结构,尤其适合处理动态数据和层级关系。虽然J*aScript没有内置的链表或树类型,但我们可以用对象和引用轻松实现它们。下面分别介绍单向链表和二叉搜索树的基本实现方式。

单向链表实现

单向链表由节点组成,每个节点包含数据和指向下一个节点的指针。

节点定义: 每个节点是一个对象,有value存储值,next指向下一个节点。

链表操作: 常见操作包括插入、删除、查找和遍历。

示例代码:

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

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

  // 在链表末尾添加节点
  append(val) {
    const newNode = new ListNode(val);
    if (!this.head) {
      this.head = newNode;
      return;
    }
    let current = this.head;
    while (current.next) {
      current = current.next;
    }
    current.next = newNode;
  }

  // 查找是否存在某个值
  find(val) {
    let current = this.head;
    while (current) {
      if (current.val === val) return true;
      current = current.next;
    }
    return false;
  }

  // 删除某个值的节点
  remove(val) {
    if (!this.head) return;
    if (this.head.val === val) {
      this.head = this.head.next;
      return;
    }
    let current = this.head;
    while (current.next) {
      if (current.next.val === val) {
        current.next = current.next.next;
        return;
      }
      current = current.next;
    }
  }

  // 遍历并打印所有值
  display() {
    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.display(); // 输出: 1 -> 2 -> 3
list.remove(2);
list.display(); // 输出: 1 -> 3

二叉搜索树实现

二叉搜索树(BST)是一种树形结构,每个节点最多有两个子节点,且左子节点值小于父节点,右子节点值大于父节点。

MallWWI新模式返利商城系统 MallWWI新模式返利商城系统

MallWWI新模式返利商城系统基于成熟的飞蛙商城系统程序框架,支持多数据库配合,精美的界面模板,人性化的操作体验,完备的订单流程,丰富的促销形式,适合搭建稳定、高效的电子商务平台。创造性的完美整合B2B\B2C\B2S\C2B\C2C\P2C\O2O\M2C\B2F等模式,引领“互联网+”理念,实现商家联盟体系下的线上线下全新整合销售方式,独创最流行的分红权返利与排队返钱卡功能。安全、稳定、结构

MallWWI新模式返利商城系统 0 查看详情 MallWWI新模式返利商城系统

节点结构: 包含valleftright

核心操作: 插入、查找、删除、遍历(中序、前序、后序)。

示例代码:

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

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

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

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

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

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

  // 中序遍历(升序输出)
  inorderTr*ersal() {
    const result = [];
    this._inorder(this.root, result);
    return result;
  }

  _inorder(node, result) {
    if (node) {
      this._inorder(node.left, result);
      result.push(node.val);
      this._inorder(node.right, result);
    }
  }
}

使用示例:

const bst = new BinarySearchTree();
bst.insert(5);
bst.insert(3);
bst.insert(7);
bst.insert(2);
bst.insert(4);

console.log(bst.inorderTr*ersal()); // [2, 3, 4, 5, 7]
console.log(bst.search(3)); // true
console.log(bst.search(6)); // false

基本上就这些。链表适合频繁插入删除的场景,树适合快速查找和排序。理解它们的指针操作和递归逻辑,对提升算法能力很有帮助。不复杂但容易忽略细节,比如边界判断和引用更新。

以上就是J*aScript数据结构_链表与树实现的详细内容,更多请关注其它相关文章!


# 按需  # 淘宝网站推广犯法不  # kol推广营销的目的  # 品牌seo优化有哪些  # 北京外贸网站优化推广  # 抚州网站建设报价  # 肇庆手机网站建设企业  # seo文章多长合适  # 营销推广软文市场价格  # 兰州抖音排名seo  # 老板支持seo理由  # 是一个  # javascript  # 如何用  # 管理器  # 如何使用  # 新模式  # 递归  # 遍历  # 数据结构  # 链表  # app  # node  # java 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  一加 14R 快充无反应_一加 14R 充电优化  Golang如何安装Swagger工具_GoSwagger文档生成环境  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  京东单号查询入口_京东快递订单追踪入口  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析  Win11怎么查看电脑配置_Win11硬件配置检测工具使用  58动漫网在线官方网 58动漫网正版动漫入口网址  Win10快速启动功能利弊分析 Win10开启或关闭快速启动教程【技巧】  C++ string find函数返回值npos详解_C++字符串查找失败的判断条件  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  印象笔记如何设提醒任务防漏执行_印象笔记设提醒任务防漏执行【任务提醒】  sublime怎么设置启动时打开的窗口_sublime会话管理与热退出  J*aScript数据结构转换:将对象数组按类别分组  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  小猿搜题在线学习页面在哪_小猿搜题在线学习中心入口  铁路12306的积分有效期是多久_铁路12306积分有效期说明  深入理解J*a合成构造器:何时以及为何阻止其生成  深入理解J*aScript Promise异步执行与微任务队列  《北京人工智能产业白皮书(2025)》发布:全年核心产值预计突破 4500 亿元  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  抖音网页版企业服务中心登录入口_抖音网页版企业登录平台  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  AO3官网镜像链接 Archive of Our Own同人文在线浏览  QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  响应式容器内容自动缩放与宽高比维持教程  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  《刺客信条:影》PS5 Pro和Switch 2画面对比  新三国志曹操传110级星符试炼夏侯渊极难攻略  LINUX怎么设置定时任务_LINUX crontab配置教程  护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?  AngularJS $http POST请求数据传递与Go后端接收实践  Animex动漫社网入口地址 Animex动漫社网正版在线入口  React/Next.js中实现列表项的动态选择与移动  千牛数据看板网页版_千牛数据看板网页版访问方法  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  搜狗浏览器如何使用密码生成器创建强密码 搜狗浏览器内置密码安全工具  4399免费游戏网址入口 4399小游戏免费入口点开即玩  怎么在html里运行vbs脚本_html中运行vbs脚本方法【教程】  苹果手机如何防止被恶意App追踪  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  腾讯QQ邮箱官方网站_QQ邮箱网页版在线登录 

搜索