JavaScript实现二叉搜索树

yizhihongxing

让我来详细地讲解一下"JavaScript实现二叉搜索树"的攻略。

什么是二叉搜索树

二叉搜索树是一种树型数据结构,其中每个节点最多有两个子节点,且满足以下性质:

  • 左子节点上所有的值都小于该节点的值。
  • 右子节点上所有的值都大于该节点的值。

JavaScript 实现二叉搜索树

1. 创建二叉搜索树节点的类

我们可以用 JavaScript 类的方式来创建二叉搜索树。首先我们需要创建节点类:

class Node {
  constructor(data) {
    this.data = data
    this.left = null
    this.right = null
  }
}

该类包含了一个存储数据的 data 属性,和两个指向左子节点和右子节点的属性 leftright

2. 创建二叉搜索树类

接下来,在 BinarySearchTree 类中添加节点和其它操作:

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

  insert(data) {
    const node = new Node(data)

    if (!this.root) {
      this.root = node
      return
    }

    let current = this.root

    while (true) {

      if (data < current.data) {

        if (!current.left) {
          current.left = node
          break
        } else {
          current = current.left
        }

      } else if (data > current.data) {

        if (!current.right) {
          current.right = node
          break
        } else {
          current = current.right
        }

      } else {

        break

      }

    }
  }

  search(data) {
    let current = this.root

    while (current) {

      if (data === current.data) {
        return true
      } else if (data < current.data) {
        current = current.left
      } else {
        current = current.right
      }

    }

    return false
  }

  inOrderPrint(callback) {
    const inOrder = (node) => {
      if (node) {
        inOrder(node.left)
        callback(node)
        inOrder(node.right)
      }
    }

    inOrder(this.root)
  }

  preOrderPrint(callback) {
    const preOrder = (node) => {
      if (node) {
        callback(node)
        preOrder(node.left)
        preOrder(node.right)
      }
    }

    preOrder(this.root)
  }

  postOrderPrint(callback) {
    const postOrder = (node) => {
      if (node) {
        postOrder(node.left)
        postOrder(node.right)
        callback(node)
      }
    }

    postOrder(this.root)
  }
}

我们定义了 insert() 方法,该方法会遍历二叉搜索树的节点,寻找合适的位置插入新节点。

search() 方法会在二叉搜索树中查找给定数据的节点,如果找到则返回 true,否则返回 false。

inOrderPrint()preOrderPrint()postOrderPrint() 方法会遍历整个树,并在每个节点上执行回调函数,分别对应中序遍历、先序遍历和后序遍历。

3. 使用示例

现在我们来看两个使用二叉搜索树的例子。

第一个例子是将一组数据插入到二叉搜索树中,并使用中序遍历打印二叉搜索树的节点值:

const bst = new BinarySearchTree()

bst.insert(10)
bst.insert(5)
bst.insert(15)
bst.insert(3)
bst.insert(7)
bst.insert(13)
bst.insert(17)

bst.inOrderPrint((node) => {
  console.log(node.data)
})

输出结果为:

3
5
7
10
13
15
17

第二个例子是在二叉搜索树中查找一个节点:

const bst = new BinarySearchTree()

bst.insert(10)
bst.insert(5)
bst.insert(15)
bst.insert(3)
bst.insert(7)
bst.insert(13)
bst.insert(17)

console.log(bst.search(13))

输出结果为 true,表示二叉搜索树中存在一个值为 13 的节点。

至此,我们已经完成了一个 JavaScript 实现的二叉搜索树。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现二叉搜索树 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 基于NodeJS的前后端分离的思考与实践(二)模版探索

    【标题】基于NodeJS的前后端分离的思考与实践(二)模版探索 【摘要】本文将探索基于NodeJS的前后端分离场景下的模版渲染,包括模版引擎的选择、模版渲染的实现方式以及相关的代码示例。 一、选择模板引擎 在前后端分离的情况下,有许多选择支持前后端都能够使用的模版引擎,例如EJS、Handlebars、Pug等。在选择模板引擎的时候,我们需要考虑一些关键因素…

    node js 2023年6月8日
    00
  • 详解jenkins自动化部署vue

    详解Jenkins自动化部署Vue的完整攻略 为了实现自动化部署Vue项目,我们需要用到Jenkins这个开源自动化工具,它可以帮助我们在不同的环境中自动构建、测试和部署Vue应用程序。下面是详细的步骤和实例说明: 准备工作 安装Jenkins和Node.js 安装Vue CLI 准备好一个Vue项目 配置Jenkins 1. 安装插件 在Jenkins控制…

    node js 2023年6月8日
    00
  • 浅谈node模块与npm包管理工具

    让我来为你详细讲解“浅谈node模块与npm包管理工具”的完整攻略。 1. 什么是Node模块? 在Node.js中,一个“模块”就是一个单独的文件。每个文件都被视为一个独立的模块,模块可以对外暴露变量和函数,也可以引用其他模块中的变量和函数。 Node.js在执行一个JS文件时,会自动创建一个module对象,该对象包含了该模块的信息。每个模块都可以使用m…

    node js 2023年6月8日
    00
  • node.js爬虫框架node-crawler初体验

    下面是对“node.js爬虫框架node-crawler初体验”的详细讲解。 什么是node.js爬虫框架node-crawler? node-crawler是一个基于node.js的爬虫框架,它的特点是能够像jQuery一样,通过选择器选择页面的元素进行数据抓取。使用node-crawler可以轻松地构建一个爬虫应用程序,提取特定网站的数据内容,适用于各种…

    node js 2023年6月8日
    00
  • node+koa2+mysql+bootstrap搭建一个前端论坛

    这里给出一个基于node+koa2+mysql+bootstrap搭建一个前端论坛的完整攻略,包括环境配置、项目结构、代码实现等。这个项目将会实现以下功能: 用户注册和登录 发布和删除文章,并支持文章评论和点赞功能 收藏文章和个人中心页面 环境配置 首先,需要安装node.js和mysql数据库。在安装完成后,可以使用npm安装koa2的脚手架工具koa-g…

    node js 2023年6月8日
    00
  • 详解Node.JS模块 process

    详解Node.JS模块 process Node.JS提供了一个全局模块process,它提供了与当前进程的交互能力。在本文中,我们会详细介绍process模块的各种用法。 获取启动NodeJS应用程序的命令行参数 process模块的argv属性返回一个数组,该数组包含了NodeJS应用程序启动时传递给程序的命令行参数。 // demo1.js conso…

    node js 2023年6月8日
    00
  • nodejs npm错误Error:UNKNOWN:unknown error,mkdir ‘D:\Develop\nodejs\node_global’at Error

    当使用npm安装模块时,可能会遇到Error: UNKNOWN: unknown error, mkdir ‘D:\Develop\nodejs\node_global’的错误。这个错误通常是因为没有权限在指定的目录中创建文件夹而导致的。 以下是解决此错误的完整攻略: 确保用户具有文件夹创建权限 首先,确保当前用户具有在指定目录中创建文件夹的权限。对于D:\…

    node js 2023年6月8日
    00
  • 配置vite.confgi.ts无法使用require问题以及解决

    Vite是一个面向现代浏览器的轻量级Vue.js开发构建工具。它能够提供快速的开发和热重载,但是在使用中,有可能会出现“配置vite.config.ts无法使用require问题”的情况。这种情况的原因是由于在Vite2版本中移除了require函数,而在Vite.config.ts中使用了该函数。 以下是解决该问题的步骤: 1.更改配置文件 打开vite.…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部