【JavaScript】一文带你吃透二叉树的四种遍历方式

176 阅读3分钟

1.前言

  • 在数据结构的学习中,二叉树是一个绕不开的重要知识点,而掌握二叉树的遍历方式更是理解和运用二叉树的基础。本文将从树的基本概念出发,结合 JavaScript 代码实例,详细讲解二叉树的四种遍历方式(前序、中序、后序、层序),帮助你彻底搞懂其中的原理。

1.1 树的关键属性

树是一种非线性的数据结构,它由 n(n≥0)个节点组成。在树中,有几个核心概念需要掌握:

  • 层次:从根节点开始计数,根节点为第 1 层(部分教材定义为第 0 层),其子女为第 2 层,以此类推。
  • 高度:对于一个节点,其高度是指从该节点到最深叶子节点的路径上的节点数量;树的高度则是根节点的高度。
  • :节点的度是指该节点拥有的子节点数量,树的度是树中所有节点度的最大值。

1.2 二叉树的定义

二叉树是一种特殊的树,它的每个节点的度都小于等于 2,即每个节点最多有两个子节点,分别称为左子节点和右子节点,且左、右子节点有明确的顺序,不能随意交换。

2.JavaScript 实现二叉树的四种遍历方式

二叉树的遍历是指按照某种顺序访问树中的所有节点,且每个节点仅被访问一次。常用的遍历方式有四种:前序遍历、中序遍历、后序遍历和层序遍历。我们将以如下的二叉树结构为例进行讲解:

const root ={
    val:'A',
    left:{
        val:'B',
        left:{
            val:'D'
        },
        right:{
            val:'E'
        }
    },
    right:{
        val:'C',
        left:{
            val:'F'
        },
    }
}

2.1 前序遍历(根左右)

前序遍历的顺序是:先访问根节点,再遍历左子树,最后遍历右子树。

实现代码如下:

//先序遍历
function preorder(root){
    if(!root) return

    console.log(root.val)
    preorder(root.left)
    preorder(root.right)
}
preorder(root)

2.2 中序遍历(左根右)​

中序遍历的顺序是:先遍历左子树,再访问根节点,最后遍历右子树。​

实现代码如下:

//中序遍历
function inorder(root){
    if(!root) return

    inorder(root.left)
    console.log(root.val)
    inorder(root.right)
}
inorder(root)

2.3后序遍历(左右根)​

后序遍历的顺序是:先遍历左子树,再遍历右子树,最后访问根节点。​

实现代码如下:

后序遍历
function postorder(root){
    if(!root) return

    postorder(root.left)
    postorder(root.right)
    console.log(root.val)
}
postorder(root)

**2.4层序遍历(按层次遍历) **

var levelOrder = function (root) {
const queue = [];
queue.push(root);
const res = [];
if (root === null) {
return res;
}
while (queue.length !== 0) {
// 记录当前层级节点数
let length = queue.length;
// 存放每一层的节点
let curLevel = [];
for (let i = 0; i < length; i++) {
let node = queue.shift();
curLevel.push(node.val);
// 存放当前层下一层的节点
node.left && queue.push(node.left);
node.right && queue.push(node.right);

}
// 把每一层的结果放到结果数组
res.push(curLevel);

}
return res;

};
console.log(levelOrder(root));

3.DFS 与 BFS 在 JavaScript 二叉树遍历中的体现

3.1 DFS(深度优先搜索)

深度优先搜索的特点是优先沿着树的深度遍历,尽可能深入到子树中,直到无法继续再回溯。在 JavaScript 实现中,二叉树的前序、中序、后序遍历都属于 DFS,它们通过递归的方式实现,只是访问根节点的时机不同。

3.2BFS(广度优先搜索)

广度优先搜索的特点是优先沿着树的宽度遍历,先访问完当前层的所有节点,再进入下一层。在 JavaScript 中,二叉树的层序遍历属于 BFS,通常通过队列来实现,先将根节点入队,出队时将其左、右子节点入队,依次循环,从而实现按层次遍历。

总结

  • JavaScript 实现二叉树的四种遍历方式是学习二叉树相关操作的基础,前序、中序、后序遍历基于深度优先搜索,层序遍历基于广度优先搜索。通过理解每种遍历的顺序和 JavaScript 实现原理,以及它们与 DFS、BFS 的对应关系,能帮助我们更好地运用二叉树解决实际问题。