544 字
3 分钟
翻转二叉树

题目描述
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
解题思路
- 递归分治法:
- 采用二叉树的后序遍历(左→右→根)
- 递归翻转左子树
- 递归翻转右子树
- 交换当前节点的左右子树
- 迭代遍历法:
- 使用队列进行层序遍历(BFS)
- 每访问一个节点,立即交换其左右子树
- 将子节点加入队列继续处理
- 前序替代方案:
- 前序遍历(根→左→右)同样可行
- 先交换子树再递归处理
关键洞察
- 子树独立性:
- 翻转操作具有递归特性
- 翻转整树 = 翻转左子树 + 翻转右子树 + 交换左右子树
- 交换本质:
- 只需交换左右子节点指针
- 无需修改节点值或创建新节点
- 遍历顺序无关性:
- 先序/后序/层序遍历均可完成翻转
- 中序遍历需调整(避免重复处理)
- 原地修改特性:
- 所有操作在原始树上进行
- 空间复杂度仅依赖于遍历方式
复杂度分析
方法 | 时间复杂度 | 空间复杂度 |
---|---|---|
递归法 | O(n) | O(h) [树高, 最坏O(n)] |
迭代BFS | O(n) | O(w) [最大宽度] |
迭代DFS | O(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;};