翻转二叉树:前序和后序的写法完全一样

一、题目很简单,但很有名

翻转二叉树就是交换每个节点的左右子节点。这道题因为 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)。


五、总结

  1. 翻转 = 交换每个节点的左右子节点
  2. 前序和后序写法都能通过,因为交换和递归可交换
  3. 递归代码 4 行,面试首选
  4. 这道题是二叉树递归入门的最佳练习
相关推荐
断点之下4 天前
从“理扑克牌”到“分组优化”——直接插入排序与希尔排序详解
数据结构·算法·排序算法
豆角焖肉4 天前
冒泡、快排、堆排的实现逻辑与选择思路
java·算法·排序算法·快排·冒泡·堆排
Angle.寻梦5 天前
数据结构--排序
数据结构·算法·排序算法
Gxg123.5 天前
bitset的简单介绍和应用
c++·算法·排序算法
兰令水6 天前
hot100【acm版】【2026.7.25/26打卡-java版本】
java·算法·排序算法
王老师青少年编程6 天前
csp信奥赛C++高频考点专项训练:【排序算法】案例9:成绩排序
c++·排序算法·csp·高频考点·信奥赛·成绩排序
王老师青少年编程7 天前
csp信奥赛C++高频考点专项训练:【排序算法】案例7:最高分数的学生姓名
c++·排序算法·csp·高频考点·信奥赛·最高分数的学生姓名
未来之窗软件服务10 天前
计算机考试-快速排序—东方仙盟
数据结构·算法·排序算法·仙盟创梦ide·东方仙盟
春生野草11 天前
C基础--八大排序(个人笔记)
c语言·笔记·排序算法
王老师青少年编程12 天前
csp信奥赛C++高频考点专项训练:【排序算法】案例1:三位数排序
c++·排序算法·csp·高频考点·信奥赛·三位数排序