题目
!! 题目来源:翻转二叉树 - 力扣
分析
前面的文章里已经简单介绍了树和二叉树的基本概念,这里就不再赘述,我们直接来分析一下题意:根据示例,我们可以知道,所谓翻转二叉树,就是让二叉树的每个节点左右节点进行交换。
这里借助 LeetCode 题解中的动图来说明问题:
那么整体思路就很简单了:
- 首先自然是递归的第一步,找到边界:这里的边界自然是被节点为 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;
};
结果如下:
!! 💡 Tip:这里可能有的读者会产生困惑。左右节点进行交换之后,不会产生混乱吗?
其实对与上面的问题,说明算法的动图可能产生了一定的误导作用,实际上,在左右节点交换之后,树应该是如下所示的情况才对:
实际上,节点翻转之后,它们指向各自子节点的指针是不变的,所以才能完成上面的操作。
优化
这里借助了一个临时变量,而在 Javascript 中,这个临时变量完全可以省去,这样的技巧在前面也提到过,就是利用解构赋值:
var invertTree = function (root) {
if (root === null) return root;
[root.left, root.right] = [invertTree(root.right), invertTree(root.left)];
return root;
};
结果如下:
说在后面的
关于本题,其实还有一个故事:Homebrew 的作者 Max Howell 去谷歌面试的时候,因为写不出翻转二叉树而被刷掉了,回家后他实在想不通,就在 Twitter 上吐槽了这件事:你们公司那么多人用我写的软件,却因为我写不出翻转二叉树把我给刷掉了,简直 * 了🐕了。