JavaScript二叉搜索树构建操作详解

yizhihongxing

JavaScript二叉搜索树构建操作详解

什么是二叉搜索树?

二叉搜索树(Binary Search Tree,简称BST)是一种二叉树,它满足以下限制:

  • 对于每个节点,它的左子树中所有节点的值都小于这个节点的值;
  • 对于每个节点,它的右子树中所有节点的值都大于这个节点的值;
  • 左右子树都是二叉搜索树。

如何构建二叉搜索树?

遍历一棵空树时,我们首先得想到的是如何构建这棵树。接下来介绍三种不同的方法:

方法一:插入操作

从空的二叉搜索树开始,进行插入操作,对于每个节点,它会根据它的值和根节点的比较结果,决定到左子树或右子树中去查找下一个节点,直到找到一个空节点。然后,我们把新节点插入到这个空节点的位置上。

在代码实现中,我们需要创建 Node 类和 BinarySearchTree 类。Node 类表示二叉搜索树中的每个节点,它有 valueleftChildrightChild 三个属性。BinarySearchTree 类用于创建二叉搜索树,它有 root 属性指向二叉搜索树的根节点,以及 insert 方法用于插入一个节点。

class Node {
  constructor(value) {
    this.value = value;
    this.leftChild = null;
    this.rightChild = null;
  }
}

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

  insert(value) {
    const newNode = new Node(value);
    if (!this.root) {
      this.root = newNode;
    } else {
      let currentNode = this.root;
      while (true) {
        if (value < currentNode.value) {
          if (!currentNode.leftChild) {
            currentNode.leftChild = newNode;
            break;
          }
          currentNode = currentNode.leftChild;
        } else {
          if (!currentNode.rightChild) {
            currentNode.rightChild = newNode;
            break;
          }
          currentNode = currentNode.rightChild;
        }
      }
    }
  }
}

const tree = new BinarySearchTree();
tree.insert(10);
tree.insert(6);
tree.insert(15);
tree.insert(3);
tree.insert(8);
tree.insert(20);

方法二:数组转二叉搜索树

我们也可以用一个已经有序的数组来构建二叉搜索树。在这种情况下,每个节点的值都是数组的中位数。然后我们把数组分成两半,分别用这两半的数来构建左子树和右子树。对于子树,我们采用递归的方式来构建。

function buildBSTFromArray(array) {
  if (array.length === 0) {
    return null;
  } else if (array.length === 1) {
    return new Node(array[0]);
  } else {
    const middleIndex = Math.floor(array.length / 2);
    const rootNode = new Node(array[middleIndex]);
    rootNode.leftChild = buildBSTFromArray(array.slice(0, middleIndex));
    rootNode.rightChild = buildBSTFromArray(array.slice(middleIndex + 1));
    return rootNode;
  }
}

const array = [3, 6, 8, 10, 15, 20];
const tree = new BinarySearchTree();
tree.root = buildBSTFromArray(array);

方法三:前序遍历和中序遍历

我们已经知道,对于二叉搜索树,每个节点的值都大于它左子树中所有节点的值,且小于它右子树中所有节点的值。所以前序遍历中的第一个节点就是二叉搜索树的根节点,而中序遍历中根节点的左侧都是左子树的节点值,右侧都是右子树的节点值。

我们可以根据这两个遍历结果,来构建一棵二叉搜索树。具体来说,我们首先取出前序遍历中的第一个节点作为根节点。然后,在中序遍历中找到这个节点,根据它左侧和右侧的节点,分别递归构建左子树和右子树。

function buildBST(preorder, inorder) {
  if (preorder.length === 0 || inorder.length === 0) {
    return null;
  }
  const rootValue = preorder[0];
  const rootNode = new Node(rootValue);
  const rootIndex = inorder.indexOf(rootValue);
  rootNode.leftChild = buildBST(preorder.slice(1, rootIndex + 1), inorder.slice(0, rootIndex));
  rootNode.rightChild = buildBST(preorder.slice(rootIndex + 1), inorder.slice(rootIndex + 1));
  return rootNode;
}

const preorder = [10, 6, 3, 8, 15, 20];
const inorder = [3, 6, 8, 10, 15, 20];
const tree = new BinarySearchTree();
tree.root = buildBST(preorder, inorder);

示例说明

示例一:插入操作

以向一个空的二叉搜索树中依次插入节点 106153820 为例:

const tree = new BinarySearchTree();
tree.insert(10);
tree.insert(6);
tree.insert(15);
tree.insert(3);
tree.insert(8);
tree.insert(20);

这段代码的输出为:

BinarySearchTree {
  root: Node {
    value: 10,
    leftChild: Node { value: 6, leftChild: [Node], rightChild: [Node] },
    rightChild: Node { value: 15, leftChild: null, rightChild: [Node] }
  }
}

示例二:前序遍历和中序遍历

以前序遍历数组 [10, 6, 3, 8, 15, 20] 和中序遍历数组 [3, 6, 8, 10, 15, 20] 来构建二叉搜索树为例:

const preorder = [10, 6, 3, 8, 15, 20];
const inorder = [3, 6, 8, 10, 15, 20];
const tree = new BinarySearchTree();
tree.root = buildBST(preorder, inorder);

这段代码的输出为:

BinarySearchTree {
  root: Node {
    value: 10,
    leftChild: Node {
      value: 6,
      leftChild: Node { value: 3, leftChild: null, rightChild: [Node] },
      rightChild: Node { value: 8, leftChild: null, rightChild: null }
    },
    rightChild: Node {
      value: 15,
      leftChild: null,
      rightChild: Node { value: 20, leftChild: null, rightChild: null }
    }
  }
}

总结

二叉搜索树是一种非常重要的数据结构,在工程实践中广泛应用。我们可以采用插入操作、数组转二叉搜索树、前序遍历和中序遍历等多种方式来构建二叉搜索树。需要注意的是,在构建过程中,我们需要保证树满足二叉搜索树的限制。

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

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

相关文章

  • node.js中的fs.write方法使用说明

    当需要在node.js中进行文件系统操作时,常用的模块就是fs模块。其中的write方法可用于向文件中写入数据。本篇攻略将详细讲解fs.write方法的使用说明。 方法介绍 fs.write(fd, buffer[, offset[, length[, position]]], callback) 该方法使用异步的方式向文件中写入数据。传入参数说明如下: f…

    node js 2023年6月8日
    00
  • nodejs获取表单数据的三种方法实例

    下面为你详细讲解“nodejs获取表单数据的三种方法实例”的完整攻略。 一、背景介绍 在Web开发中,表单提交是经常用到的一种方式,因为它可以实现用户向服务器端提交数据的操作。而在Node.js中,我们可以使用node-formidable、body-parser等模块来获取表单数据。本文将介绍这两种模块的使用方法,以及另外一种获取表单数据的简单方法。 二、…

    node js 2023年6月8日
    00
  • Node.js编写组件的三种实现方式

    那我来详细讲解一下“Node.js编写组件的三种实现方式”吧。 前言 Node.js是一种用于编写高效的、可扩展的网络应用程序的开发平台。除了能够构建完整的应用程序外,Node.js还可以作为组件进行编写,以便在多个项目之间重用。本文将讲解三种实现Node.js组件的方式。 方法一:直接导出函数 Node.js组件的第一种实现方式是直接导出函数。这种方法非常…

    node js 2023年6月8日
    00
  • Node.js中的模块化,npm包管理器详解

    Node.js中的模块化 Node.js中模块化的核心思想是将代码段封装起来,使得模块与模块之间彼此独立,提高了代码的可重用性,并且使得代码更加易维护。Node.js的模块化分为两类:核心模块和文件模块。 核心模块 Node.js自带了一些核心模块,例如http、fs、path等,这些模块可以直接在代码中使用,无需安装任何第三方模块,也无需指定路径。 以下是…

    node js 2023年6月8日
    00
  • 整理一些JavaScript的IE和火狐的兼容性注意事项

    下面是一份详细的“整理JavaScript兼容性注意事项”的攻略。 1. 兼容性问题的背景介绍 在Web开发中,由于不同的浏览器采用不同的JavaScript引擎,因此会出现一些浏览器兼容性的问题。而这些问题往往会影响到代码的运行及网站的正常功能。特别是在IE和火狐这两款浏览器中,会出现比较明显的兼容问题。因此,我们需要在编写JavaScript代码时,重视…

    node js 2023年6月8日
    00
  • JavaScript 用Node.js写Shell脚本[译]

    让我来详细讲解“JavaScript 用Node.js写Shell脚本[译]”的完整攻略。 什么是 Shell 脚本? Shell 脚本是一种运行在 Unix/Linux 系统上的脚本,用于自动执行一系列的命令或操作。通常用 Shell 脚本来完成常规的任务,如备份数据、自动部署应用程序等。 Shell 脚本通常是使用 Shell 编程语言编写的。Shell…

    node js 2023年6月8日
    00
  • PostgreSQL Node.js实现函数计算方法示例

    我来详细讲解“PostgreSQL Node.js实现函数计算方法示例”的完整攻略。 PostgreSQL Node.js实现函数计算方法示例 前言 在实际开发中,我们经常需要使用数据库中的函数计算数据。PostgreSQL是一个强大的关系型数据库,在其中定义和调用函数非常方便。同时,Node.js是一个开放源代码、跨平台的Javascript运行环境,可用…

    node js 2023年6月8日
    00
  • node将geojson转shp返回给前端的实现方法

    要实现“node将geojson转shp返回给前端”的功能,可以采用以下步骤: 安装相关依赖 在Node.js中,我们可以使用geojson2shp库将GeoJSON文件转换为Shapefile文件。首先需要在命令行中安装该库,命令如下: npm install geojson2shp –save 创建服务器 使用Node.js创建一个简单的服务器,监听前…

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