前言
二叉树遍历在各种算法和数据结构问题中都有广泛的应用,如二叉搜索树、表达式的树形表示、堆的实现等。同时也是前端面试中的常客,掌握好二叉树遍历算法对于一名合格的前端工程师来说至关重要。
概念
二叉树遍历(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);