跳到主要内容

226. 翻转二叉树

题目描述

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

示例 1

示例1

输入root = [4,2,7,1,3,6,9]

输出[4,7,2,9,6,3,1]

示例 2

输入root = [2,1,3]

输出[2,3,1]

示例 3

输入root = []

输出[]

提示

  • 树中节点数目范围在 [0, 100]
  • -100 <= Node.val <= 100

出处LeetCode

解法一:递归

思路

递归遍历二叉树,交换左右子树。

实现

function invertTree(root: TreeNode | null): TreeNode | null {
if (root === null) {
return null;
}
const left = invertTree(root.left);
const right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}

复杂度分析

  • 时间复杂度:O(n)O(n),其中 n 是二叉树的节点数。每个节点在递归中只被遍历一次。
  • 空间复杂度:O(n)O(n),其中 n 是二叉树的节点数。递归函数的调用栈的深度等于二叉树的高度,最坏情况下二叉树的高度等于节点数。

解法二:迭代

思路

使用队列进行层序遍历,交换每个节点的左右子树。

实现

function invertTree(root: TreeNode | null): TreeNode | null {
if (root === null) {
return null;
}
const queue: TreeNode[] = [root];
while (queue.length) {
const node = queue.shift()!;
const left = node.left;
node.left = node.right;
node.right = left;
if (node.left !== null) {
queue.push(node.left);
}
if (node.right !== null) {
queue.push(node.right);
}
}
return root;
}

复杂度分析

  • 时间复杂度:O(n)O(n),其中 n 是二叉树的节点数。每个节点在广度优先搜索中只被遍历一次。
  • 空间复杂度:O(n)O(n),其中 n 是二叉树的节点数。空间复杂度取决于队列的大小,队列的大小不会超过二叉树的宽度,最坏情况下二叉树的宽度等于节点数。