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

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日

相关文章

  • Nodejs实现多房间简易聊天室功能

    下面是详细的Nodejs实现多房间简易聊天室功能攻略。 一、需求分析 首先,我们需要明确聊天室的基本需求。聊天室是一个可以供多个用户在同一时间和空间下进行在线聊天交流的程序。具体的基本需求如下: 支持多人同时在线聊天; 支持多房间创建与加入; 实现聊天信息的即时同步; 具有用户登录和退出功能; 用户发言时可以看到房间内其他用户的发言内容。 二、技术选型 在技…

    node js 2023年6月8日
    00
  • node和vue实现商城用户地址模块

    商城用户地址模块可以通过node和vue来进行实现。本攻略将详细介绍如何使用node和vue实现商城用户地址模块,包括前端和后端的所有代码和示例。 前端部分 1.项目初始化 首先使用vue-cli进行项目初始化,具体步骤: npm install -g vue-cli vue init webpack address-module 2.样式开发 使用elem…

    node js 2023年6月8日
    00
  • Nodejs Sequelize手册学习快速入门到应用

    Node.js 是一种流行的服务器端 JavaScript 运行环境,而 Sequelize 是一款基于 Node.js 的ORM 库,其可以支持多种数据库,如MySQL、PostgreSQL、SQLite 和 Microsoft SQL Server。Sequelize具有易学易用的特点,从 Sequelize的官方文档开始入手,可以快速学习和开发 Seq…

    node js 2023年6月8日
    00
  • nodejs如何在package.json中设置多条启动命令

    要在package.json中设置多条启动命令,可以使用”scripts”字段。在此字段中,可以定义多个命令,并且可以通过npm run命令调用这些命令。下面是设置多条启动命令的详细攻略: 步骤1:创建package.json文件 如果尚未创建package.json文件,请运行以下命令: npm init 按照提示输入相应信息,创建一个新的package.…

    node js 2023年6月8日
    00
  • 用nodeJS搭建本地文件服务器的几种方法小结

    我非常乐意为您提供关于用NodeJS搭建本地文件服务器的几种方法小结的完整攻略。 用NodeJS搭建本地文件服务器的几种方法小结 基于Node.js的http模块搭建文件服务器 首先,安装Node.js并检查是否成功安装,可以通过在终端或命令提示符中输入命令node -v来查看版本号。 在文件系统中选择一个文件夹作为服务器根目录,应确保Node.js具有访问…

    node js 2023年6月8日
    00
  • 使用Express+Node.js对mysql进行增改查操作

    使用Express+Node.js对MySQL进行增、改、查操作的步骤如下: 安装依赖库 在终端输入以下命令: npm install express mysql –save 连接到MySQL数据库 在之前所述的程序文件中,require mysql 并定义数据库信息: const mysql = require(‘mysql’); const conne…

    node js 2023年6月8日
    00
  • Nodejs处理异常操作示例

    当我们的Node.js应用程序遇到错误时,我们需要进行适当的异常处理。这可以帮助我们更好地了解错误的来源和如何解决问题。在此处,我将提供一些Node.js处理异常操作的示例。 异常处理的重要性 在开始提供示例之前,我们先来了解一下异常处理的重要性。一旦错误发生,我们需要在代码中捕获并对其进行处理,否则应用将会崩溃并给用户带来不好的体验。 Node.js提供了…

    node js 2023年6月8日
    00
  • 浅谈让你的代码更简短,更整洁,更易读的ES6小技巧

    以下是“浅谈让你的代码更简短,更整洁,更易读的ES6小技巧”的具体攻略: 使用箭头函数 ES6中新增的箭头函数语法可以极大地简化代码量,特别是在处理需要高阶函数的情况下。 箭头函数不仅更简单,而且它的this性质比普通的函数定义更好用。下面是一个简单的示例代码: // 普通函数定义 function square(x) { return x * x; } c…

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