JavaScript实现二叉树定义、遍历及查找的方法详解

二叉树是一种常见的树形数据结构,由一个根节点和最多两个子节点组成,其中左子节点小于等于根节点,右子节点大于根节点。在JavaScript中,我们可以使用对象来模拟二叉树。

1. 二叉树的定义

我们可以定义一个二叉树的节点对象,包含三个属性:值(value)、左子节点(left)、右子节点(right)。定义二叉树类(Tree),包含一个根节点(root)。

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

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

2. 二叉树的遍历

二叉树的遍历有三种方式:前序遍历、中序遍历和后序遍历。

前序遍历

前序遍历的方式是先遍历根节点,然后遍历左子节点,再遍历右子节点。

实现方式:

function preOrder(node) {
  if (node === null) return [];
  const res = [];
  res.push(node.value);
  res.push(...preOrder(node.left));
  res.push(...preOrder(node.right));
  return res;
}

中序遍历

中序遍历的方式是先遍历左子节点,然后遍历根节点,再遍历右子节点。

实现方式:

function inOrder(node) {
  if (node === null) return [];
  const res = [];
  res.push(...inOrder(node.left));
  res.push(node.value);
  res.push(...inOrder(node.right));
  return res;
}

后序遍历

后序遍历的方式是先遍历左子节点,然后遍历右子节点,再遍历根节点。

实现方式:

function postOrder(node) {
  if (node === null) return [];
  const res = [];
  res.push(...postOrder(node.left));
  res.push(...postOrder(node.right));
  res.push(node.value);
  return res;
}

3. 二叉树的查找

插入节点

二叉树的查找可以通过插入节点来实现,插入节点时需要遍历二叉树,找到插入的位置。这里以中序遍历为例:

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

  insert(value) {
    const node = new TreeNode(value);
    if (!this.root) {
      this.root = node;
      return this;
    }
    let cur = this.root;
    while (cur) {
      if (value < cur.value) {
        if (!cur.left) {
          cur.left = node;
          return this;
        }
        cur = cur.left;
      } else {
        if (!cur.right) {
          cur.right = node;
          return this;
        }
        cur = cur.right;
      }
    }
    return this;
  }
}

查找节点

查找节点的实现也可以通过遍历二叉树来实现,这里同样以中序遍历为例:

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

  find(value) {
    let cur = this.root;
    while (cur) {
      if (value === cur.value) {
        return cur;
      } else if (value < cur.value) {
        cur = cur.left;
      } else {
        cur = cur.right;
      }
    }
    return null;
  }
}

4. 示例

以下为一个简单的示例,展示了如何使用这些方法创建一个二叉树,并进行遍历和查找:

const tree = new Tree();
tree.insert(5)
    .insert(3)
    .insert(7)
    .insert(2)
    .insert(4)
    .insert(6)
    .insert(8);

console.log('preOrder:', preOrder(tree.root));   // [5, 3, 2, 4, 7, 6, 8]
console.log('inOrder:', inOrder(tree.root));     // [2, 3, 4, 5, 6, 7, 8]
console.log('postOrder:', postOrder(tree.root)); // [2, 4, 3, 6, 8, 7, 5]

const node = tree.find(4);
console.log(node);  // TreeNode { value: 4, left: [TreeNode], right: [TreeNode] }

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现二叉树定义、遍历及查找的方法详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 勾选时激活input 否则禁用的javascript代码

    下面是“勾选时激活input 否则禁用的javascript代码”的攻略。 准备工作 在正式编写代码之前,我们需要准备一个HTML页面和一个JS文件。 首先,我们需要在HTML页面中添加一个input框和一个复选框。代码如下所示: <label for="input1">输入框1:</label> <inpu…

    JavaScript 2023年6月10日
    00
  • 原生JavaScript实现合并多个数组示例

    下面我将详细介绍如何使用原生JavaScript实现合并多个数组。 1. 简单粗暴的方法 我们可以使用concat()函数将多个数组合并成一个: let arr1 = [1, 2, 3]; let arr2 = [4, 5, 6]; let arr3 = [7, 8, 9]; let arr = arr1.concat(arr2, arr3); consol…

    JavaScript 2023年5月27日
    00
  • Js参数值中含有单引号或双引号问题的解决方法

    Js参数值中含有单引号或双引号问题的解决方法可以通过转义字符进行转义。以下是详细的攻略: 方法一:使用转义字符 在引号前加上反斜杠(\)作为转义字符即可解决问题。如果参数值中含有单引号,则用反斜杠转义单引号(\’),如果参数值中含有双引号,则用反斜杠转义双引号(\”)。 例如: let name1 = "Tom’s cat"; // 包含…

    JavaScript 2023年6月11日
    00
  • C# 执行Javascript脚本的方法步骤

    C# 执行 JavaScript 脚本是非常常见的需求,下面是执行 JavaScript 脚本的方法步骤: 1. 引入COM组件 首先需要引入COM组件“Microsoft Internet Controls”。在Visual Studio的项目中点开Solution Explorer,右键References -> Add Reference…,…

    JavaScript 2023年5月27日
    00
  • JS DOMReady事件的六种实现方法总结

    下面我将详细讲解“JS DOMReady事件的六种实现方法总结”的攻略。 一、什么是DOMReady事件? DOMReady事件是指在页面中DOM树加载完成后触发的事件。在此时我们可以对页面中的DOM元素进行操作。 二、JS DOMReady事件的六种实现方法 1. 利用window.onload事件 window.onload = function() {…

    JavaScript 2023年6月10日
    00
  • javascript json对象小技巧之键名作为变量用法分析

    本文将详细讲解”javascript json对象小技巧之键名作为变量用法”,该技巧可以提高代码的灵活性和可读性。 什么是json对象? JSON是一种轻量级的数据交换格式,JS中的JSON对象是Javascript原生支持的一种格式化的数据类型,它可以用来传递和存储简单的结构化数据。 JSON 常用于与服务端交换数据。 通常我们获取的json对象会有多个键…

    JavaScript 2023年5月27日
    00
  • JavaScript严格模式不支持八进制的问题讲解

    JavaScript 严格模式是一种在 JavaScript 中启用更严格语法的模式,目的是为了避免一些潜在的错误和不安全的行为。在严格模式下,一些语法和行为会有所限制和修改,其中就包括不支持八进制数字字面量。下面将对此问题进行详细讲解。 什么是八进制数字字面量? 在 JavaScript 中,我们可以用不同的进制来表示数字。除了默认的十进制以外,还支持八进…

    JavaScript 2023年6月10日
    00
  • JavaScript实现表单验证示例

    下面是针对“JavaScript实现表单验证示例”的完整攻略: 1. 表单验证的基本思路 前端表单验证的基本思路是,当用户提交表单时,先阻止表单的默认提交行为,然后通过JavaScript对表单进行内容的检测和验证,如果发现问题,则提示用户并阻止表单的提交。否则,允许表单进行提交操作。 通常,表单验证的实现流程如下: 针对表单的提交事件进行监听; 在提交事件…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部