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 的对应关系,能帮助我们更好地运用二叉树解决实际问题。