前言
二叉树遍历在各种算法和数据结构问题中都有广泛的应用,如二叉搜索树、表达式的树形表示、堆的实现等。同时也是前端面试中的常客,掌握好二叉树遍历算法对于一名合格的前端工程师来说至关重要。
概念
二叉树遍历(Binary Tree Traversal)是指按照某种规则访问二叉树中所有节点的过程。由于二叉树是一个递归的数据结构,因此遍历操作通常也是递归进行的。
二叉树的遍历主要有四种方式:前序遍历(Pre-order Traversal)、中序遍历(In-order Traversal)、后序遍历(Post-order Traversal)和层次遍历(Level-order Traversal)。
代码原理
首先定义一个 TreeNode 类来表示二叉树的节点
class TreeNode {
constructor(val, left = null, right = null) {
this.val = val; // 节点的值
this.left = left; // 左子节点,默认为null
this.right = right; // 右子节点,默认为null
}
}
前序遍历
定义遍历方法
function preorderTraversal(root) {
if (root === null) {
return; // 如果节点为空,则直接返回
}
console.log(root.val); // 访问当前节点的值
preorderTraversal(root.left); // 递归遍历左子树
preorderTraversal(root.right); // 递归遍历右子树
}
创建二叉树
// 创建二叉树
const root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
调用方法执行遍历
// 执行遍历
console.log("前序遍历:");
preorderTraversal(root);
中序遍历
定义遍历方法
// 中序遍历
function inorderTraversal(root) {
if (root === null) {
return;
}
inorderTraversal(root.left); // 遍历左子树
console.log(root.val); // 访问根节点
inorderTraversal(root.right); // 遍历右子树
}
创建二叉树
// 创建二叉树
const root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
调用方法执行遍历
console.log("中序遍历:");
inorderTraversal(root);
后序遍历
定义遍历方法
// 后序遍历
function postorderTraversal(root) {
if (root === null) {
return;
}
postorderTraversal(root.left); // 遍历左子树
postorderTraversal(root.right); // 遍历右子树
console.log(root.val); // 访问根节点
}
创建二叉树
// 创建二叉树
const root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
调用方法执行遍历
console.log("后序遍历:");
postorderTraversal(root);
层次遍历
定义遍历方法
// 层次遍历(使用队列)
function levelOrderTraversal(root) {
if (root === null) {
return;
}
const queue = [root]; // 初始化队列,将根节点入队
while (queue.length > 0) {
const node = queue.shift(); // 出队一个节点
console.log(node.val); // 访问该节点
if (node.left !== null) {
queue.push(node.left); // 左子节点入队
}
if (node.right !== null) {
queue.push(node.right); // 右子节点入队
}
}
}
创建二叉树
// 创建二叉树
const root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
调用方法执行遍历
console.log("层次遍历:");
levelOrderTraversal(root);