📜  反转二叉树javascript(1)

📅  最后修改于: 2023-12-03 15:37:07.516000             🧑  作者: Mango

反转二叉树JavaScript

在二叉树遍历中,我们通常从根节点开始,沿着左子树递归访问,然后沿着右子树递归访问,最后才回到根节点。但是,有时候我们需要将二叉树进行反转,也就是将左子树和右子树交换位置。在这篇文章中,我们将介绍如何在JavaScript中实现反转操作。

实现原理

二叉树的反转可以通过递归或迭代来实现。在递归实现中,我们从根节点开始,将左右子树交换位置,然后递归地对左子树和右子树进行反转操作。而在迭代实现中,我们需要使用栈或队列将每个节点保存下来,然后交换左右子树后再依次压入子节点。

递归实现

递归实现是比较简单的方法,因为它符合二叉树遍历的思想。我们可以从根节点开始,将左右子树交换位置,然后递归地对左子树和右子树进行反转操作。具体实现如下:

function invertTree(root) {
  if (!root) return null;
  const left = root.left;
  const right = root.right;
  root.left = invertTree(right);
  root.right = invertTree(left);
  return root;
}

我们首先判断节点是否为空,如果为空则直接返回null。接着,我们将节点的左右子节点保存起来,然后将节点的左子节点赋值为递归调用右子节点的结果,右子节点赋值为递归调用左子节点的结果,最后返回调整后的节点。

迭代实现

迭代实现需要使用一个栈或队列来保存每个节点。我们首先将根节点入栈,然后在栈非空的情况下循环遍历。每次取出栈顶节点,交换其左右子树,并将左右子节点入栈。具体实现如下:

function invertTree(root) {
  if (!root) return null;
  const stack = [root];
  while (stack.length > 0) {
    const node = stack.pop();
    const left = node.left;
    const right = node.right;
    node.left = right;
    node.right = left;
    if (node.left) stack.push(node.left);
    if (node.right) stack.push(node.right);
  }
  return root;
}

我们首先判断节点是否为空,如果为空则直接返回null。接着,我们创建一个栈,并将根节点入栈。在while循环中,我们弹出栈顶节点,并交换其左右子树。如果节点存在左子节点,则将左子节点入栈;如果节点存在右子节点,则将右子节点入栈。最后返回调整后的节点。

总结

总的来说,二叉树的反转是一个比较简单的操作。在递归实现中,我们需要注意递归结束的条件;在迭代实现中,我们需要使用一个栈或队列保存每个节点,避免遗漏。无论使用哪种实现方式,都需要对二叉树的结构比较熟悉,才能够快速而准确地进行操作。