【Daily Interview】- 15 翻转二叉树

361 阅读2分钟

题目

图片1
图片1

!! 题目来源:翻转二叉树 - 力扣

分析

前面的文章里已经简单介绍了树和二叉树的基本概念,这里就不再赘述,我们直接来分析一下题意:根据示例,我们可以知道,所谓翻转二叉树,就是让二叉树的每个节点左右节点进行交换。

这里借助 LeetCode 题解中的动图来说明问题:

图片2
图片2

那么整体思路就很简单了:

  • 首先自然是递归的第一步,找到边界:这里的边界自然是被节点为 null
  • 左右节点进行交换
  • 递归遍历左右节点

于是按照思路实现代码即可:

var invertTree = function (root) {
  if (root === null) {
    return root;
  }
  let temp = root.left;
  root.left = root.right;
  root.right = temp;
  invertTree(root.left);
  invertTree(root.right);
  return root;
};

结果如下:

图片3
图片3

!! 💡 Tip:这里可能有的读者会产生困惑。左右节点进行交换之后,不会产生混乱吗?

其实对与上面的问题,说明算法的动图可能产生了一定的误导作用,实际上,在左右节点交换之后,树应该是如下所示的情况才对:

图片4
图片4

实际上,节点翻转之后,它们指向各自子节点的指针是不变的,所以才能完成上面的操作。

优化

这里借助了一个临时变量,而在 Javascript 中,这个临时变量完全可以省去,这样的技巧在前面也提到过,就是利用解构赋值:

var invertTree = function (root) {
  if (root === null) return root;
  [root.left, root.right] = [invertTree(root.right), invertTree(root.left)];
  return root;
};

结果如下:

图片5
图片5

说在后面的

关于本题,其实还有一个故事:Homebrew 的作者 Max Howell 去谷歌面试的时候,因为写不出翻转二叉树而被刷掉了,回家后他实在想不通,就在 Twitter 上吐槽了这件事:你们公司那么多人用我写的软件,却因为我写不出翻转二叉树把我给刷掉了,简直 * 了🐕了。