问题描述
翻转一棵二叉树,即将每个节点的左右子树进行交换。
示例:
text
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
递归解法
思路分析
递归是解决二叉树问题的经典方法。翻转二叉树的核心思想是:对于每个节点,交换它的左右子树,然后递归地对左右子树进行同样的操作。
代码实现
java
class Solution {
public TreeNode invertTree(TreeNode root) {
// 递归函数的终止条件,节点为空时返回
if(root == null) {
return null;
}
// 下面三句是将当前节点的左右子树交换
TreeNode tmp = root.right;
root.right = root.left;
root.left = tmp;
// 递归交换当前节点的左子树
invertTree(root.left);
// 递归交换当前节点的右子树
invertTree(root.right);
// 函数返回时就表示当前这个节点,以及它的左右子树都已经交换完了
return root;
}
}
时间复杂度分析
-
时间复杂度:O(n),其中n是二叉树的节点数。每个节点都会被访问一次。
-
空间复杂度:O(h),其中h是二叉树的高度。递归调用栈的深度等于树的高度,最坏情况下(树退化为链表)为O(n)。
其他递归写法
后序遍历版本
java
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
// 先递归翻转左右子树
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
// 然后交换当前节点的左右子树
root.left = right;
root.right = left;
return root;
}
}
这种写法先递归处理子树,再交换当前节点的左右子树,是一种后序遍历的思路。
应用场景
-
镜像二叉树:判断两棵树是否互为镜像。
-
对称二叉树:判断一棵树是否对称。
-
图像处理:在某些图像处理算法中,需要翻转图像数据。
-
数据结构转换:在某些情况下,需要将树的结构进行镜像转换以满足特定需求。
注意事项
-
空树处理:总是要考虑输入为空树的情况。
-
递归深度:对于非常深的树,递归可能会导致栈溢出,此时应考虑迭代解法。
-
原地修改:所有解法都是原地修改树的结构,不需要额外的树空间。
总结
翻转二叉树是一个经典的递归问题,通过这个问题可以深入理解二叉树的遍历和递归思想。无论是递归还是迭代解法,核心都是交换每个节点的左右子树。理解这个问题的多种解法有助于提升对二叉树操作的掌握程度。