返回
前端算法进阶:树与深度优先与广度优先遍历
前端
2023-09-02 12:29:06
前端算法学习总结篇(JS):树
树是一种非线性数据结构,它由一个或多个结点组成。每个结点包含一个值和一些指向其他结点的指针。树通常用于表示层次结构,例如文件系统、组织结构图和语法树。
深度优先遍历
深度优先遍历(DFS)是一种遍历树的算法,它从根结点开始,依次遍历结点的左子树,然后遍历结点的右子树。DFS 有两个变种:前序遍历和后序遍历。
前序遍历
前序遍历的顺序是:根结点、左子树、右子树。可以用递归或栈来实现。
// 递归实现前序遍历
function preOrder(root) {
if (!root) return;
console.log(root.val);
preOrder(root.left);
preOrder(root.right);
}
// 栈实现前序遍历
function preOrder(root) {
if (!root) return;
const stack = [root];
while (stack.length) {
const node = stack.pop();
console.log(node.val);
if (node.right) stack.push(node.right);
if (node.left) stack.push(node.left);
}
}
后序遍历
后序遍历的顺序是:左子树、右子树、根结点。可以用递归或栈来实现。
// 递归实现后序遍历
function postOrder(root) {
if (!root) return;
postOrder(root.left);
postOrder(root.right);
console.log(root.val);
}
// 栈实现后序遍历
function postOrder(root) {
if (!root) return;
const stack = [root];
const res = [];
while (stack.length) {
const node = stack[stack.length - 1];
if (!node.left && !node.right) {
res.push(node.val);
stack.pop();
} else {
if (node.right) stack.push(node.right);
if (node.left) stack.push(node.left);
}
}
return res;
}
广度优先遍历
广度优先遍历(BFS)是一种遍历树的算法,它按层次从上到下依次遍历结点。BFS 也可以用队列来实现。
// 队列实现广度优先遍历
function bfs(root) {
if (!root) return;
const queue = [root];
while (queue.length) {
const node = queue.shift();
console.log(node.val);
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
}
总结
树是一种重要的数据结构,在前端开发中经常会遇到。深度优先遍历和广度优先遍历是遍历树的两种基本算法。这些算法在解决前端开发中遇到的实际问题时非常有用,例如查找元素、判断是否存在路径以及计算树的高度。