一、题目很简单,但很有名
翻转二叉树就是交换每个节点的左右子节点。这道题因为 Homebrew 作者面试谷歌时没写出来而广为流传。
二、递归解法
javascript
var invertTree = function(root) {
if (!root) return null;
const left = invertTree(root.left);
const right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
};
这是后序写法:先递归翻转左右子树,再交换当前节点。
也可以写成前序:先交换当前节点,再递归翻转左右子树。两种都是对的,因为交换左右子树和递归翻转这两个操作是交换的。
三、BFS 迭代解法
javascript
var invertTree = function(root) {
if (!root) return null;
const queue = [root];
while (queue.length) {
const node = queue.shift();
[node.left, node.right] = [node.right, node.left];
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
return root;
};
用队列逐层处理,每出队一个节点就交换它的左右子节点。逻辑更直观,但要注意 shift() 在大数据量下是 O(n)。
四、复杂度
时间 O(n)------每个节点访问一次。 空间:递归 O(h),BFS O(n)。
五、总结
- 翻转 = 交换每个节点的左右子节点
- 前序和后序写法都能通过,因为交换和递归可交换
- 递归代码 4 行,面试首选
- 这道题是二叉树递归入门的最佳练习