JavaScript实现二叉树的先序、中序及后序遍历方法详解

yizhihongxing

JavaScript实现二叉树的先序、中序及后序遍历方法详解

一、二叉树的定义

二叉树是一个每个节点最多有两个子树的树结构,通常分为左子树、右子树。二叉树有多种遍历方式,包括先序遍历、中序遍历和后序遍历。

其中,

  • 先序遍历:按照“根结点-左子树-右子树”的方式遍历二叉树;
  • 中序遍历:按照“左子树-根结点-右子树”的方式遍历二叉树;
  • 后序遍历:按照“左子树-右子树-根结点”的方式遍历二叉树。

在 JavaScript 中,我们可以用基本的数据结构来表示一棵二叉树。二叉树节点的结构通常包含一个值、左子树和右子树三个属性。

下面是一个基本的二叉树节点结构的 JavaScript 代码表示:

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

下面是一个生成二叉树的函数,通过数组 inputArr 生成一棵二叉树:

const buildBinaryTree = (inputArr) => {
  const root = new TreeNode(inputArr[0]);
  const queue = [root];
  let index = 1;

  while (index < inputArr.length) {
    const currNode = queue.shift();

    if (inputArr[index] !== null) {
      currNode.left = new TreeNode(inputArr[index]);
      queue.push(currNode.left);
    }

    index++;

    if (index >= inputArr.length) break;

    if (inputArr[index] !== null) {
      currNode.right = new TreeNode(inputArr[index]);
      queue.push(currNode.right);
    }

    index++;
  }

  return root;
};

二、先序遍历实现

先序遍历按照“根结点-左子树-右子树”的方式遍历二叉树。步骤如下:

  1. 如果节点为空,则返回
  2. 访问根节点
  3. 遍历左子树
  4. 遍历右子树

以下是先序遍历的 JavaScript 实现:

const preorderTraversal = (root, result = []) => {
  if (!root) return result;

  result.push(root.val);

  root.left && preorderTraversal(root.left, result);
  root.right && preorderTraversal(root.right, result);

  return result;
};

以下是一个简单的示例:

const inputArr = [1, 2, 3, 4, 5, 6, 7];
const root = buildBinaryTree(inputArr);
console.log(preorderTraversal(root)); // [1, 2, 4, 5, 3, 6, 7]

三、中序遍历实现

中序遍历按照“左子树-根结点-右子树”的方式遍历二叉树。步骤如下:

  1. 如果节点为空,则返回
  2. 遍历左子树
  3. 访问根节点
  4. 遍历右子树

以下是中序遍历的 JavaScript 实现:

const inorderTraversal = (root, result = []) => {
  if (!root) return result;

  root.left && inorderTraversal(root.left, result);
  result.push(root.val);
  root.right && inorderTraversal(root.right, result);

  return result;
};

以下是一个简单的示例:

const inputArr = [1, 2, 3, 4, 5, 6, 7];
const root = buildBinaryTree(inputArr);
console.log(inorderTraversal(root)); // [4, 2, 5, 1, 6, 3, 7]

四、后序遍历实现

后序遍历按照“左子树-右子树-根结点”的方式遍历二叉树。步骤如下:

  1. 如果节点为空,则返回
  2. 遍历左子树
  3. 遍历右子树
  4. 访问根节点

以下是后序遍历的 JavaScript 实现:

const postorderTraversal = (root, result = []) => {
  if (!root) return result;

  root.left && postorderTraversal(root.left, result);
  root.right && postorderTraversal(root.right, result);
  result.push(root.val);

  return result;
};

以下是一个简单的示例:

const inputArr = [1, 2, 3, 4, 5, 6, 7];
const root = buildBinaryTree(inputArr);
console.log(postorderTraversal(root)); // [4, 5, 2, 6, 7, 3, 1]

以上是 JavaScript 实现二叉树的先序、中序及后序遍历方法的详细攻略。

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

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

相关文章

  • JavaScript中的闭包

    JavaScript中的闭包是一个非常重要的概念,也是比较难以理解的一个部分。在理解闭包之前,首先需要明确以下几个概念: 变量作用域(Scope),指一个变量可以被访问的区域。 函数作用域(Function scope),指函数内部定义的所有变量在函数外部都是不可访问的。 作用域链(Scope chain),指当一个函数被调用时,JavaScript引擎会去…

    JavaScript 2023年6月10日
    00
  • cookie的优化与购物车实例

    关于“cookie的优化与购物车实例”的完整攻略,我把它分成以下几部分,分别是: 什么是cookie cookie的优化 购物车实例说明 什么是cookie cookie指的是保存在用户计算机中的小文件,由网站或应用程序创建。cookie通常包含了一些网站的信息,例如用户偏爱的主题或购物车内容。每次用户访问同一网站时,浏览器会向服务器发送cookie。这可以…

    JavaScript 2023年6月11日
    00
  • JS实现的多张图片轮流播放幻灯片效果

    下面是 JS 实现多张图片轮流播放幻灯片效果的完整攻略: 确定需求 在实现多张图片轮流播放幻灯片效果前,我们需要明确一些需求: 显示多张图片:需要将多张图片放在同一个容器中,用于轮流播放; 轮流播放图片:需要编写 JS 代码实现轮流播放多张图片的逻辑; 显示切换控制按钮:为了方便用户手动控制图片切换,可以添加切换控制按钮; 自动轮播:为了提升用户体验,可以设…

    JavaScript 2023年5月28日
    00
  • JavaScript判断两个值相等的方法详解

    下面是关于“JavaScript判断两个值相等的方法详解”的完整攻略: JavaScript判断两个值相等的方法详解 在JavaScript中,判断两个值是否相等有多种方法,这里我们分别介绍全等、双等和Object.is这三种方法。 全等(===) 全等(===)用于判断两个值是否类型和值都相等,示例如下: console.log(1 === 1); // …

    JavaScript 2023年5月28日
    00
  • JAVASCRIPT 客户端验证数据的合法性代码(正则)第2/2页

    JAVASCRIPT 客户端验证数据的合法性代码(正则)攻略 什么是正则表达式? 正则表达式,也称为RegExp对象,是一种强大且灵活的字符串匹配工具,可用于匹配、替换、删除文本内容。在JavaScript中,正则表达式由斜杠(/)包围,并在斜杠之间包含模式文本。 为什么要使用正则表达式? 数据的合法性是Web表单中的关键问题,JavaScript正则表达式…

    JavaScript 2023年6月1日
    00
  • 微信小程序实现圆心进度条

    接下来我将为大家详细讲解“微信小程序实现圆心进度条”的完整攻略。该攻略分为以下几个步骤: 步骤一:创建页面 在微信小程序开发者工具中创建一个页面,并在页面中引入canvas组件,用于绘制圆心进度条。 <!– 页面 wxml 代码 –> <canvas canvas-id="canvas1" style="w…

    JavaScript 2023年6月11日
    00
  • JavaScript实现多态和继承的封装操作示例

    让我给您介绍一下“JavaScript实现多态和继承的封装操作示例”的完整攻略吧。 目录 多态的实现 方法重写 方法重载 继承的实现 原型链继承 借用构造函数继承 组合继承 多态的实现 多态是一种面向对象编程语言的特性,它允许不同的对象通过相同的接口来进行访问,在不同的对象上实现不同的行为。在 JavaScript 中,我们可以通过方法重写和方法重载来实现多…

    JavaScript 2023年5月28日
    00
  • js获取dom的高度和宽度(可见区域及部分等等)

    要获取DOM元素的宽度和高度,我们可以使用JavaScript中的clientWidth和clientHeight属性。这两个属性返回的是DOM元素的可视区域大小,不包括边框和外边距。以下是获取DOM元素宽度和高度的代码: const element = document.getElementById(‘myElement’); const elementW…

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