返回

二叉树遍历:遍历方式图解算法步骤及JS代码实现

前端

深度优先遍历

深度优先遍历是一种沿着树的深度一层一层往下遍历的遍历方法。它有三种不同的实现方式:先序遍历、中序遍历和后序遍历。

1. 先序遍历:

先序遍历的算法步骤如下:

  1. 访问当前结点。
  2. 遍历左子树。
  3. 遍历右子树。

先序遍历的图解如下:

[图片:先序遍历]

先序遍历的JavaScript代码实现如下:

function preorderTraversal(root) {
  if (root === null) {
    return;
  }

  console.log(root.data);
  preorderTraversal(root.left);
  preorderTraversal(root.right);
}

2. 中序遍历:

中序遍历的算法步骤如下:

  1. 遍历左子树。
  2. 访问当前结点。
  3. 遍历右子树。

中序遍历的图解如下:

[图片:中序遍历]

中序遍历的JavaScript代码实现如下:

function inorderTraversal(root) {
  if (root === null) {
    return;
  }

  inorderTraversal(root.left);
  console.log(root.data);
  inorderTraversal(root.right);
}

3. 后序遍历:

后序遍历的算法步骤如下:

  1. 遍历左子树。
  2. 遍历右子树。
  3. 访问当前结点。

后序遍历的图解如下:

[图片:后序遍历]

后序遍历的JavaScript代码实现如下:

function postorderTraversal(root) {
  if (root === null) {
    return;
  }

  postorderTraversal(root.left);
  postorderTraversal(root.right);
  console.log(root.data);
}

广度优先遍历

广度优先遍历是一种沿着树的宽度一层一层往下遍历的遍历方法。广度优先遍历也称层次遍历,每层结点依次从左到右排列。

广度优先遍历的算法步骤如下:

  1. 把根结点加入到队列中。
  2. 当队列不为空时,依次从队列中取出结点,并访问该结点。
  3. 把该结点的左右子树加入到队列中。

广度优先遍历的图解如下:

[图片:广度优先遍历]

广度优先遍历的JavaScript代码实现如下:

function levelOrderTraversal(root) {
  if (root === null) {
    return;
  }

  const queue = [];
  queue.push(root);

  while (queue.length > 0) {
    const node = queue.shift();
    console.log(node.data);

    if (node.left !== null) {
      queue.push(node.left);
    }

    if (node.right !== null) {
      queue.push(node.right);
    }
  }
}

总结

二叉树遍历是遍历二叉树中所有结点的一种算法。它有两种不同的实现方式:深度优先遍历和广度优先遍历。深度优先遍历包括先序遍历、中序遍历和后序遍历,而广度优先遍历也称为层次遍历。这四种遍历方式各有其优缺点,具体使用哪种方式取决于具体应用场景。