544 字
3 分钟
翻转二叉树

题目描述#

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

解题思路#

  1. 递归分治法
    • 采用二叉树的后序遍历(左→右→根)
    • 递归翻转左子树
    • 递归翻转右子树
    • 交换当前节点的左右子树
  2. 迭代遍历法
    • 使用队列进行层序遍历(BFS)
    • 每访问一个节点,立即交换其左右子树
    • 将子节点加入队列继续处理
  3. 前序替代方案
    • 前序遍历(根→左→右)同样可行
    • 先交换子树再递归处理

关键洞察#

  1. 子树独立性
    • 翻转操作具有递归特性
    • 翻转整树 = 翻转左子树 + 翻转右子树 + 交换左右子树
  2. 交换本质
    • 只需交换左右子节点指针
    • 无需修改节点值或创建新节点
  3. 遍历顺序无关性
    • 先序/后序/层序遍历均可完成翻转
    • 中序遍历需调整(避免重复处理)
  4. 原地修改特性
    • 所有操作在原始树上进行
    • 空间复杂度仅依赖于遍历方式

复杂度分析#

方法时间复杂度空间复杂度
递归法O(n)O(h) [树高, 最坏O(n)]
迭代BFSO(n)O(w) [最大宽度]
迭代DFSO(n)O(h) [树高]

:n 为节点总数,h 为树高度,w 为树最大宽度

代码实现#

递归法

/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
var invertTree = function (root) {
if (!root) return root;
const left = invertTree(root.left);
const right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
};

迭代 BFS

/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
const invertTree = (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;
};

相似题目#

翻转二叉树
https://website-truelovings-projects.vercel.app/posts/algorithms/翻转二叉树/
作者
欢迎来到StarSky的网站!
发布于
2025-08-14
许可协议
CC BY-NC-SA 4.0