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

yizhihongxing

二叉树是一种常见的树形数据结构,由一个根节点和最多两个子节点组成,其中左子节点小于等于根节点,右子节点大于根节点。在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日

相关文章

  • 全面兼容的javascript时间格式化函数(比较实用)

    全面兼容的javascript时间格式化函数(比较实用) 1. 功能介绍 本文将介绍如何编写一个全面兼容的 JavaScript 时间格式化函数。该函数可以将时间格式化为指定的字符串,并且兼容 IE 6 及以上的浏览器。 2. 编写步骤 2.1 定义函数 首先,我们需要定义一个函数来进行格式化。该函数的参数为需要格式化的时间和格式化字符串,返回值为格式化后的…

    JavaScript 2023年5月27日
    00
  • 一个即时表单验证的javascript代码

    下面就为您详细讲解如何编写一个即时表单验证的 JavaScript 代码。 编写 JavaScript 表单验证代码的基本步骤 获取表单的各个输入项,如输入框、单选框、多选框等,并对每个输入项都定义一个监听事件(如 onblur、onkeyup 等),监听输入内容的改变。 在监听事件中编写检验函数,该函数应当返回布尔值来表示输入项是否符合要求。可以根据不同的…

    JavaScript 2023年6月10日
    00
  • js获取当前年月日-YYYYmmDD格式的实现代码

    获取当前年月日的实现代码需要分三个步骤: 获取当前日期时间 分别获取年、月、日 拼接成指定格式的日期字符串 获取当前日期时间 在 JavaScript 中,可以使用 new Date() 来获取当前日期时间。 const now = new Date(); 分别获取年、月、日 使用 Date 对象的 getFullYear()、getMonth() 和 ge…

    JavaScript 2023年5月27日
    00
  • 另一个javascript小测验(代码集合)

    下面是针对“另一个javascript小测验(代码集合)”这个题目的完整攻略,包括题目背景、具体要求、思路分析、示例说明等内容。 题目背景 “另一个javascript小测验(代码集合)”是一道多重选择的题目,涉及到javascript中的各种知识点,需要对javascript的概念、语法、函数、作用域等方面有一定的了解和掌握。 具体要求 题目要求参与者对给…

    JavaScript 2023年6月11日
    00
  • layui-laydate时间日历控件使用方法详解

    以下是关于“layui-laydate时间日历控件使用方法详解”的完整攻略: layui-laydate时间日历控件使用方法详解 简介 layui-laydate是layui前端框架中的一种日期时间选择控件,它具有丰富的功能,例如选择日期时间范围、自定义格式、快速选择等,还支持各种主题风格样式。 安装 在使用layui-laydate之前,需要先引入layu…

    JavaScript 2023年6月10日
    00
  • javascript中contains是否包含功能实现代码(扩展字符、数组、dom)

    JavaScript中的contains方法用于检查一个字符串、数组或DOM元素是否包含指定内容。它会在传入的字符串、数组或DOM元素中查找指定内容,如果找到则返回true,否则返回false。 下面我将为您提供在不同场景下实现contains功能的完整攻略。 使用ECMAScript 6中的includes方法实现contains 在ECMAScript …

    JavaScript 2023年6月10日
    00
  • JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符

    学习笔记4:JavaScript运算符和操作符 JavaScript中的运算符是用于执行各种数学和逻辑操作的符号。操作数可以是变量、常量、表达式或函数的结果。本文将带领读者掌握JavaScript中的基本运算符和操作符。 运算符 运算符是用于执行数学计算的符号,如加号、减号、乘号、除号、取余等。以下是JavaScript中常见的运算符: 算术运算符 运算符 …

    JavaScript 2023年5月18日
    00
  • 前端面试知识点锦集(JavaScript篇)

    下面我将详细讲解“前端面试知识点锦集(JavaScript篇)”的完整攻略。 本文概述 在本篇文章中,我们将总结并详细讲解一些前端面试中常见的JavaScript知识点,包括数据类型、变量、作用域、闭包、原型链、异步编程等等。这些知识点在前端开发中非常重要,也是面试中经常会问到的内容。 JavaScript数据类型 JavaScript有七种数据类型,分别是…

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