226. 翻转二叉树
题目描述
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。
示例 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
方法一:递归
递归的思路很简单,就是交换当前节点的左右子树,然后递归地交换当前节点的左右子树。
时间复杂度
可视化演示
以
root = [4, 2, 7, 1, 3, 6, 9]为例,演示「先交换再递归」的前序式翻转:每步先对调当前节点的左右孩子,再递归处理子树。蓝色为当前交换的父节点,黄色为被交换的两个孩子。点击 ▶ 播放,或逐步操作。
4
2
7
1
3
6
9
初始树。从根节点 4 开始 dfs:先交换当前节点的左右孩子,再递归处理子树
1 / 7
java
class Solution {
public TreeNode invertTree(TreeNode root) {
dfs(root);
return root;
}
private void dfs(TreeNode root) {
if (root == null) {
return;
}
TreeNode t = root.left;
root.left = root.right;
root.right = t;
dfs(root.left);
dfs(root.right);
}
}cpp
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
function<void(TreeNode*)> dfs = [&](TreeNode* root) {
if (!root) {
return;
}
swap(root->left, root->right);
dfs(root->left);
dfs(root->right);
};
dfs(root);
return root;
}
};ts
function invertTree(root: TreeNode | null): TreeNode | null {
const dfs = (root: TreeNode | null) => {
if (root === null) {
return;
}
[root.left, root.right] = [root.right, root.left];
dfs(root.left);
dfs(root.right);
};
dfs(root);
return root;
}python
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
def dfs(root):
if root is None:
return
root.left, root.right = root.right, root.left
dfs(root.left)
dfs(root.right)
dfs(root)
return root方法二:递归(后序)
与方法一思路一致,但顺序相反:先递归地翻转左右子树,最后再交换当前节点的左右孩子。
时间复杂度
可视化演示
以
root = [4, 2, 7, 1, 3, 6, 9]为例,演示「先递归再交换」的后序式翻转:先递归翻转左右子树,最后才交换当前节点的左右孩子。蓝色为当前交换的父节点,黄色为被交换的两个孩子。点击 ▶ 播放,或逐步操作。
4
2
7
1
3
6
9
后序递归:先递归翻转左右子树,最后再交换当前节点的左右孩子。从根 4 开始,先递归左子树(下标 1,值 2)
1 / 6
java
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode l = invertTree(root.left);
TreeNode r = invertTree(root.right);
root.left = r;
root.right = l;
return root;
}
}cpp
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (!root) {
return root;
}
TreeNode* l = invertTree(root->left);
TreeNode* r = invertTree(root->right);
root->left = r;
root->right = l;
return root;
}
};ts
function invertTree(root: TreeNode | null): TreeNode | null {
if (!root) {
return root;
}
const l = invertTree(root.left);
const r = invertTree(root.right);
root.left = r;
root.right = l;
return root;
}python
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if root is None:
return None
l, r = self.invertTree(root.left), self.invertTree(root.right)
root.left, root.right = r, l
return root