返回

前端算法进阶:树与深度优先与广度优先遍历

前端

前端算法学习总结篇(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);
  }
}

总结

树是一种重要的数据结构,在前端开发中经常会遇到。深度优先遍历和广度优先遍历是遍历树的两种基本算法。这些算法在解决前端开发中遇到的实际问题时非常有用,例如查找元素、判断是否存在路径以及计算树的高度。