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

作者:纸飞机时间:2026-10-22 04:38:20浏览:624

本文详细解析JavaScript中二叉树的三种核心遍历方式:先序、中序和后序。通过具体代码示例与图解,阐述递归实现逻辑,区分节点访问顺序,并展示如何构建二叉搜索树及执行遍历操作,帮助开发者深入理解数据结构与算法基础。

JavaScript二叉树遍历概述

前言:

承接上一篇关于二叉树JavaScript实现的内容,本文将重点探讨二叉树的遍历方法。

为了直观展示遍历过程,本文选取如下二叉树结构作为示例进行分析:

JavaScript二叉树遍历概述

在深入遍历逻辑之前,首先引入二叉树的基础实现代码:


function Node(data, left, right) {
  this.data = data;
  this.left = left;
  this.right = right;
  this.show = show;
}
function show() {
  return this.data;
}

function BST() {
  this.root = null;
  this.insert = insert;
}
function insert(data) {
  var n = new Node(data, null, null);
  if (this.root == null) {
   this.root = n;
  }
  else {
   var current = this.root;
   var parent;
   while (true) {
     parent = current;
     if (data < current.data) {
      current = current.left;
      if (current == null) {
        parent.left = n;
        break;
      }
     }
     else {
      current = current.right;
      if (current == null) {
        parent.right = n;
        break;
      }
     }
   }
  }
}

二叉树遍历的分类与定义

二叉树遍历的分类

二叉树的遍历主要包含先序、中序和后序三种方式。这里的“先、中、后”是相对于父节点而言的:若父节点的值最先输出,则为先序;若父节点的值在左右子节点之间输出,则为中序;若父节点的值最后输出,则为后序。需要注意的是,除了叶子节点(即最底层的节点)外,树中的其他每个节点都可以被视为父节点。

JavaScript二叉树遍历概述

先序遍历:逻辑与实现

先序遍历

先序遍历的执行顺序为:首先访问并打印父节点,接着递归遍历左子树(左子节点),最后递归遍历右子树(右子节点)。


function preOrder(node) {
  if (!(node == null)) {
   console.log(node.show() + " ");
   preOrder(node.left);
   preOrder(node.right);
  }
}

// 给BST类添加先序遍历的成员方法
function BST() {
  this.root = null;
  this.insert = insert;
  this.preOrder = preOrder;
}

preOrder函数采用递归方式实现,事实上,二叉树的遍历通常都基于递归逻辑。部分读者可能会根据“先打印父节点,再左子树,最后右子树”这一特征产生误解,误以为打印顺序仅仅是父节点、左子节点和右子节点的简单线性排列。这种误解的具体表现见下图:

JavaScript二叉树遍历概述

请注意红框标注部分,其中父节点为10,左子节点为3,右子节点为18。基于上述误解,可能会错误地推断打印顺序为10 → 3 → 18,但这并不正确。实际的遍历顺序是:先打印节点10,随后完整打印左子树的所有节点,待左子树遍历完毕后,才开始以10为父节点遍历其右子树:

JavaScript二叉树遍历概述

此时,理解的关键在于:

JavaScript二叉树遍历概述

具体思维过程如下:

JavaScript二叉树遍历概述

依此类推,当以10为父节点的左子树打印完毕后,再以相同的方式处理以10为父节点的右子树。采用这种“拆分替代”的思维模式,能更清晰地理解二叉树遍历的逻辑。

最终,先序遍历确定的二叉树节点访问顺序为:

JavaScript二叉树遍历概述

根据图示,实际的输出顺序为:10 -> 3 -> 2 -> 4 -> 9 -> 8 -> 9 -> 18 -> 13 -> 21

接下来进行先序遍历的代码实践:


var bst = new BST();
var nums = [10, 3, 18, 2, 4, 13, 21, 9, 8, 9];
for(var i = 0; i < nums.length; i++) {
  bst.insert(nums[i]);
}
bst.preOrder(bst.root);

JavaScript二叉树遍历概述

需要强调的是,输出顺序与节点的插入顺序密切相关。因为不同的插入顺序会生成结构不同的二叉树。若对此有疑问,可参考前文《二叉树的javascript实现》以获取更清晰的说明,或通过实验验证:

JavaScript二叉树遍历概述

中序遍历:特征与代码

中序遍历

理解先序遍历后,可以类推到中序和后序遍历的相关知识点。中序遍历的特征是:先打印左子树(左子节点),接着打印父节点,最后打印右子树(右子节点)。


function inOrder(node) {
  if (!(node == null)) {
   inOrder(node.left);
   console.log(node.show() + " ");
   inOrder(node.right);
  }
}

// 给BST类添加该成员方法
function BST() {
  this.root = null;
  this.insert = insert;
  this.preOrder = preOrder;
  this.inOrder = inOrder;
}

中序遍历的打印顺序如下:

JavaScript二叉树遍历概述

根据上图,实际的输出顺序为:2 -> 3 -> 4 -> 8 -> 9 -> 9 -> 10 -> 13 -> 18 -> 21

随后进行中序遍历的代码实践:

JavaScript二叉树遍历概述

后序遍历:顺序与示例

后序遍历


function postOrder(node) {
  if (!(node == null)) {
   postOrder(node.left);
   postOrder(node.right);
   console.log(node.show() + " ");
  }
}

// 给BST类添加该成员方法
function BST() {
  this.root = null;
  this.insert = insert;
  this.preOrder = preOrder;
  this.inOrder = inOrder;
  this.postOrder = postOrder;
}

后序遍历的打印顺序为:

JavaScript二叉树遍历概述

根据上图,实际的输出顺序为:2 -> 8 -> 9 -> 9 -> 4 -> 3 -> 13 -> 21 -> 18  -> 10

JavaScript二叉树遍历概述

以上即为本文的全部内容,希望对读者的学习有所帮助,也欢迎大家继续支持本站。

作者最新文章